二分图匹配模板
本文最后更新于:3 years ago
1.匈牙利算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include<bits/stdc++.h> using namespace std; typedef long long ll; #define endl '\n' const ll inf=0x3f3f3f3f; inline void FAST_IO() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); } #define N 505 int path[N][N],n,m,e,link[N]; bool vis[N]; inline int dfs(int j){ for(int i=1;i<=m;i++){ if(path[j][i]==1&&!vis[i]){ vis[i]=true; if(link[i]==-1||dfs(link[i])){ link[i]=j; return 1; } } } return 0; } inline int hungary(){ int res=0; memset(link,-1,sizeof(link)); for(int i=1;i<=n;i++){ memset(vis,false,sizeof(vis)); if(dfs(i)!=0)res++; } return res; }
signed main(){ FAST_IO(); cin>>n>>m>>e; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ path[i][j]=0; } } for(int i=0;i<e;i++){ int u,v; cin>>u>>v; path[u][v]=1; } int res=hungary(); cout<<res<<endl; return 0; }
|