【模板】二分图匹配

水一波。

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,e,head[2000010],cnt,ans,vis[2000010],f[2000010];
struct node{
    int to,next;
}a[2000010]; 
void add(int x,int y){
    a[++cnt].to=y,a[cnt].next=head[x],head[x]=cnt;
}
bool dfs(int u,int time){
    for(int i=head[u],v;v=a[i].to,i;i=a[i].next)
        if(vis[v]^time){ 
            vis[v]=time;
            if((!f[v])||dfs(f[v],time)){//若未被匹配或者能商量,就将两人匹配
                f[v]=u;return true;
            }
        }
    return false;
}
int main(){
    scanf("%d%d%d",&n,&m,&e);
    for(int i=1,a,b;i<=e;++i){
        scanf("%d%d",&a,&b);
        if(a>m||b>m) continue;
        add(a,b);
    }
    for(int i=1;i<=n;++i)
        if(dfs(i,i)) ans++;
    printf("%d",ans);
    return 0;
}
posted @ 2018-11-08 21:30  PushinL  阅读(170)  评论(0编辑  收藏  举报