zoukankan      html  css  js  c++  java
  • 【模板】二分图匹配

    洛咕

    题意:给定一个二分图,结点个数分别为(n,m),边数为(e),求二分图最大匹配数.(n,m<=1000,e<=n*m.)

    分析:直接上增广路算法即可.

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<map>
    #include<set>
    #define ll long long
    using namespace std;
    inline int read(){
        int x=0,o=1;char ch=getchar();
        while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
        if(ch=='-')o=-1,ch=getchar();
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*o;
    }
    const int N=2005;
    const int M=2000005;
    int n,m,e,ans,visit[N],match[N];
    int tot,head[N],nxt[M],to[M];
    inline void add(int a,int b){
    	nxt[++tot]=head[a];head[a]=tot;to[tot]=b;
    }
    inline bool dfs(int x){//模板
    	for(int i=head[x];i;i=nxt[i]){
    		int y=to[i];
    		if(!visit[y]){
    			visit[y]=1;
    			if(!match[y]||dfs(match[y])){
    				match[y]=x;return true;
    			}
    		}
    	}
    	return false;
    }
    int main(){
    	n=read();m=read();e=read();
    	for(int i=1;i<=e;++i){
    		int a=read(),b=read();
    		if(a>n||b>m)continue;//过滤掉不合法的连边
    		add(a,b+n);add(b+n,a);//记得b要加n
    	}
    	for(int i=1;i<=n;++i){//对左边的n个点分别跑增广路
    		memset(visit,0,sizeof(visit));
    		if(dfs(i))++ans;
    	}
    	printf("%d
    ",ans);
        return 0;
    }
    
    
  • 相关阅读:
    医院产品演变畅想
    2014-1-19
    更新一下blog
    tostring的自动调用
    解决evernote更新报错问题
    健身日记
    跑步计划
    [转载]offsetHeight , clientHeight, scrollHeight 区别
    做一个院友网站杂记
    查好友摇一摇功能的感受
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11598139.html
Copyright © 2011-2022 走看看