[kuangbin带你飞]专题十 匹配问题 (二分图最大匹配)(二分图染色)(模板)
2016-12-01 23:24
337 查看
二分图的最佳完美匹配,用到的是KM算法(匈牙利算法),下面贴出模板
#include<bits/stdc++.h>
using namespace std;
#define clr(a,b) memset(a,b,sizeof(a));
int vx[205],vy[205],vis[205],g[205][205],n,m,colour[205],flag;
int dfs(int u) {
for(int i = 1;i <= n;i++) {
if(g[u][i] && vis[i] == 0) {
vis[i] = 1;
if(!vy[i] || dfs(vy[i])) {
vy[i] = u;
return 1;
}
}
}
return 0;
}
void check(int u) {
for(int i = 1;i <= n;i++) {
if(g[u][i]) {
if(colour[i] == -1) {
if(colour[u] == 1) colour[i] = 0;
else colour[i] = 1;
check(i);
}
else if(colour[i] == colour[u]) {
flag = 0;
return ;
}
}
}
return ;
}
int main() {
while(scanf("%d%d",&n,&m) != EOF) {
clr(vy,0);
clr(vis,0);
clr(g,0);
clr(colour,-1);
for(int i = 1;i <= m;i++) {
int x,y;
scanf("%d%d",&x,&y);
g[x][y] = 1;
g[y][x] = 1;
}
flag = 1;
colour[1] = 1;
check(1);
//for(int i = 1;i <= n;i++) printf("%d ",colour[i]);
if(!flag) {printf("No\n"); continue;}
int ans = 0;
for(int i = 1;i <= n;i++) {
memset(vis,0,sizeof(vis));
if(dfs(i)) ans++;
}
printf("%d\n",ans/2);
}
}
#include<bits/stdc++.h>
using namespace std;
#define clr(a,b) memset(a,b,sizeof(a));
int vx[205],vy[205],vis[205],g[205][205],n,m,colour[205],flag;
int dfs(int u) {
for(int i = 1;i <= n;i++) {
if(g[u][i] && vis[i] == 0) {
vis[i] = 1;
if(!vy[i] || dfs(vy[i])) {
vy[i] = u;
return 1;
}
}
}
return 0;
}
void check(int u) {
for(int i = 1;i <= n;i++) {
if(g[u][i]) {
if(colour[i] == -1) {
if(colour[u] == 1) colour[i] = 0;
else colour[i] = 1;
check(i);
}
else if(colour[i] == colour[u]) {
flag = 0;
return ;
}
}
}
return ;
}
int main() {
while(scanf("%d%d",&n,&m) != EOF) {
clr(vy,0);
clr(vis,0);
clr(g,0);
clr(colour,-1);
for(int i = 1;i <= m;i++) {
int x,y;
scanf("%d%d",&x,&y);
g[x][y] = 1;
g[y][x] = 1;
}
flag = 1;
colour[1] = 1;
check(1);
//for(int i = 1;i <= n;i++) printf("%d ",colour[i]);
if(!flag) {printf("No\n"); continue;}
int ans = 0;
for(int i = 1;i <= n;i++) {
memset(vis,0,sizeof(vis));
if(dfs(i)) ans++;
}
printf("%d\n",ans/2);
}
}
相关文章推荐
- [kuangbin带你飞]专题十 匹配问题 二分图最大权匹配
- [kuangbin带你飞]专题十 匹配问题 L - Cat VS Dog (二分图最大独立集)
- [kuangbin带你飞]专题十 匹配问题 二分图多重匹配
- Hopcroft-Karp算法模板(解决二分图最大匹配问题)
- [kuangbin带你飞]专题十 匹配问题 F - Rain on your Parade(二分图匹配)(HKmatch)
- HDU 2063 过山车(模板—— 二分图最大匹配问题)
- [kuangbin带你飞]专题十 匹配问题 K - Treasure Exploration(最小边覆盖)(二分图匹配)
- [kuangbin带你飞]专题十 匹配问题 一般图匹配
- [kuangbin带你飞]专题十 匹配问题 二分匹配部分
- kuangbin带你飞 专题十 匹配问题
- HDU 2444 The Accomodation of Students(最大二分匹配(匈牙利算法)+二分图判断->模板题目)
- 二分图最大匹配问题匈牙利算法
- 网络流24题(04)圆桌问题(二分图多重匹配 + 最大流)
- 2008年第33届ACM/ICPC亚洲区预赛(哈尔滨)网络预选赛 1007__The Accomodation of Students 二分图最大匹配+染色
- hdu 二分图最大匹配问题 (hdu 1083)
- 二分图的最大匹配问题(匈牙利算法)
- poj 2195 带权重的二分图最大匹配问题
- 求二分图最大匹配——匈牙利算法模板。
- 网络流24题(07)试题库问题(二分图多重匹配 + 最大流)
- 二分图最大匹配问题