洛谷 P3386 【模板】二分图匹配
2018-03-17 14:04
267 查看
匈牙利算法dfs版,原理是不断找增广路(交替路径)。写的时候也可以理解为:为左边的未匹配点u找右边的点v完成匹配,如果v未匹配就直接匹配,如果已匹配就看v原来的匹配点match[v]能否找到新的匹配点,递归下去,如果可以,那么u和v匹配,match[v]与新的匹配点匹配,这样匹配数+1。
时间复杂度O(VE)O(VE)
时间复杂度O(VE)O(VE)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=2010; int n,m,e; int head[maxn],Ecnt; struct edge{ int to,nxt; }G[maxn*maxn*2]; inline void addE(int u,int v){ G[Ecnt]=(edge){v,head[u]}; head[u]=Ecnt++; G[Ecnt]=(edge){u,head[v]}; head[v]=Ecnt++; } int match[maxn]; bool vis[maxn]; bool dfs(int u){ for(int i=head[u];i!=-1;i=G[i].nxt){ int v=G[i].to; if(vis[v]) continue; vis[v]=1; if(!match[v]||dfs(match[v])){ match[u]=v,match[v]=u; return 1; } } return 0; } int hungarian(){ int ret=0; for(int i=1;i<=n;i++) if(!match[i]){ memset(vis,0,sizeof(vis)); if(dfs(i)) ++ret; } return ret; } int main(){ memset(head,-1,sizeof(head)); scanf("%d%d%d",&n,&m,&e); for(int i=1;i<=e;i++){ int u,v; scanf("%d%d",&u,&v); if(u<=n&&v<=m) addE(u,n+v); } printf("%d\n",hungarian()); return 0; }
相关文章推荐
- 洛谷 P3386 【模板】二分图匹配
- AC日记——【模板】二分图匹配 洛谷 P3386
- 洛谷 P3386 【模板】二分图匹配
- 洛谷P3386【模板】二分图匹配
- 洛谷P3386 【模板】二分图匹配
- 洛谷 P3386 【模板】二分图匹配 Dinic版
- 洛谷—— P3386 【模板】二分图匹配
- 洛谷 P3386【模板】二分图匹配
- 洛谷P3386 【模板】二分图匹配
- 洛谷 P3386 【模板】二分图匹配
- 洛谷 P3386 【模板】二分图匹配
- 【模板】匈牙利算法 二分图匹配 (模版题:洛谷P3386)
- [洛谷 3386]【模板】二分图匹配---匈牙利算法
- P3386 【模板】二分图匹配 Ek 与 dinic
- P3386 【模板】二分图匹配
- 洛谷 P3386 二分图最大匹配模板
- P3386 【模板】二分图匹配(匈牙利&最大流)
- 洛谷 3386 二分图匹配模板 匈牙利算法
- P3386 【模板】二分图匹配(网络流与线性规划24题01飞行员配对方案问题)
- P3386 【模板】二分图匹配