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;
    }
    
    
  • 相关阅读:
    HDU 4339 Query
    Another app is currently holding the yum lock解决方法
    m0n0wall安装教程
    网盘
    kali 网络配置
    monowall
    Windows server 2012安装vmtools遇到的问题
    利用WPF建立自适应窗口大小布局的WinForm窗口
    wpf倒影效果
    SQL 进制间如何转换
  • 原文地址:https://www.cnblogs.com/PPXppx/p/11598139.html
Copyright © 2011-2022 走看看