2019 Multi-University Training Contest 9

雨燕双飞 提交于 2019-11-27 21:40:22

Rikka with Cake

#include <bits/stdc++.h>

using namespace std;
const int maxn=2000;
int match[maxn],match1[maxn],a[maxn][maxn],m,n,vis[maxn],k,ans,ans1;
bool dfs(int x)
{
    for (int i=1; i<=m; i++)
    {
        if (a[x][i]&&!vis[i])
        {
            vis[i]=1;
            if (match[i]==0||dfs(match[i]))
            {
                match[i]=x;
                return 1;
            }
        }
    }
    return 0;
}

int main() {
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1, u, v; i <= k; i++) {
        scanf("%d%d", &u, &v);
        a[u][v] = 1;
    }
    for (int i = 1; i <= n; i++) {
        memset(vis, 0, sizeof(vis));
        if (dfs(i)) {
            ans++;
        }
    }
    for (int i = 1; i <= m; i++) {
        match1[i] = match[i];
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            a[n + 1][j] = a[n + 2][j] = a[i][j];
        }
        for (int j = 1; j <= m; j++) {
            match[j] = match1[j];
        }
        memset(vis,0,sizeof(vis));
        int mx = 0;
        if (dfs(n+1)) mx++;
        memset(vis,0,sizeof(vis));
        if (dfs(n+2)) mx++;
        ans1 = max(ans1, mx);
    }
    printf("%d\n",ans+ans1);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!