【模板整合】匈牙利算法和Hopcroft-Karp算法
2015-10-14 16:56
411 查看
匈牙利的DFS实现
Hopcroft-Karp算法
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define MAXN 1010 using namespace std; int n,m; int map[MAXN][MAXN],num[MAXN]; bool vis[MAXN]; int ans; bool find(int x) { for (int i=1;i<=n;i++) { if (!vis[i]&&map[x][i]) { vis[i]=1; if (!num[i]||find(num[i])) { num[i]=x; return 1; } } } return 0; } int main() { scanf("%d%d",&n,&m); /*for (int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y);x++;y++; map[i][x]=map[i][y]=1; }建图请自动忽略*/ for (int i=1;i<=m;i++) { memset(vis,0,sizeof(vis)); if (find(i)) ans++; else break; } printf("%d\n",ans); }
Hopcroft-Karp算法
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #define MAXN 1010 #define MAXINT 0x7fffffff using namespace std; int n,m,top,x,y; int ans; int disx[MAXN],disy[MAXN],matx[MAXN],maty[MAXN];//x,y,分别为二分图的两个点集,mat为每个点在对侧集合的匹配点,如果当前没有匹配点则为-1 struct edge { int to; edge *next; }e[MAXN*MAXN],*prev[MAXN]; void insert(int u,int v) { e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top]; } bool bfs()//寻找最短增广路 { bool ret=0; queue<int> q; memset(disx,0,sizeof(disx));memset(disy,0,sizeof(disy)); for (int i=1;i<=n;i++) if (matx[i]==-1) q.push(i);//找到未盖点,入队 while (!q.empty())//在二分图另一个点集的非盖点中寻找增广路 { int x=q.front();q.pop(); for (edge *i=prev[x];i;i=i->next) if (!disy[i->to]) { disy[i->to]=disx[x]+1; if (maty[i->to]==-1) ret=1;//找到增广路 else disx[maty[i->to]]=disy[i->to]+1,q.push(maty[i->to]); } } return ret; } bool dfs(int x)//沿增广路增广 { for (edge *i=prev[x];i;i=i->next) { if (disy[i->to]==disx[x]+1) { disy[i->to]=0; if (maty[i->to]==-1||dfs(maty[i->to])) { matx[x]=i->to;maty[i->to]=x;return 1; } } } return 0; } int main() { scanf("%d%d",&n,&m); memset(matx,-1,sizeof(matx));memset(maty,-1,sizeof(maty)); /*for (int i=1;i<=n;i++) { scanf("%d%d",&x,&y);x++;y++; insert(i,x);insert(i,y); }建图请自动忽略*/ while (bfs()) { for (int i=1;i<=m;i++) if (matx[i]==-1&&dfs(i)) ans++; } cout<<ans<<endl; }
相关文章推荐
- 树形DP 或 最小顶点覆盖=最大匹配(双向图)(HDU 1053)
- 匈牙利算法
- 二分图
- POJ 2724 Purifying Machine
- HDU 2444 The Accomodation of Students 判断二分图 + 最大匹配
- hdu1150 Machine Schedule
- 匈牙利二分匹配之找妹子趣解
- 二分图最大匹配总结(匈牙利算法)
- poj 1469 COURSES 二分图最大匹配数
- poj 2239 Selecting Courses 二分图最大匹配数
- poj 3020 Antenna Placement 二分图最小路径覆盖
- poj 3041 Asteroids 二分图最小点覆盖
- Hdu 1507 Uncle Tom's Inherited Land*
- HDOJ-1281二分图最大匹配
- HDU1607--二分图最大匹配
- POJ3041--Asteroids--二分图最大匹配--Konig
- POJ3020--Antenna Placement--二分图最大匹配
- Cards--SOJ week 2.1004--二分图最大匹配
- POJ 2239-Selecting Courses
- 二分图最大匹配 & 最大独立集