hdu 2063(二分图的最大匹配)

hdu-2063

思路:

这题是二分图最大匹配的模板题。

二分图的最大匹配:找一个二分图的最大匹配,选择尽量多的边,使任意两条选中的边没有公共点。(如果所有点都是匹配点,这个匹配就是完美匹配)。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 200200;
int head[maxn],nxt[maxn],vis[maxn],ver[maxn],tot=0,link[maxn];
void addedge(int u,int v){
    ver[tot] = v;
    nxt[tot] = head[u];
    head[u] = tot++;
}
void Init(){
    memset(head,-1,sizeof(head));
    memset(nxt,-1,sizeof(nxt));
    memset(link,-1,sizeof(link));
    tot = 0;
}
bool dfs(int u){
    for(int i=head[u];~i;i=nxt[i])
    if(!vis[ver[i]]){
        vis[ver[i]] = 1;
        if(link[ver[i]]==-1||dfs(link[ver[i]])){
            link[ver[i]] = u;
            return true;
        }
    }
    return false;
}
int main(void)
{
    int n,m,k,i,j,x,y;
    while(~scanf("%d",&k)&&k){
        Init();
        scanf("%d%d",&n,&m);
        for(i=1;i<=k;i++){
            scanf("%d%d",&x,&y);
            y+=550;
            addedge(x,y);
            addedge(y,x);
        }
        int ans = 0;
        for(i=1;i<=n;i++){
            memset(vis,0,sizeof(vis));
            if(dfs(i)) ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41829060/article/details/89236221