现在的位置: 首页 > 综合 > 正文

POJ3692

2012年07月25日 ⁄ 综合 ⁄ 共 780字 ⁄ 字号 评论关闭
//POJ3692
//匈牙利算法,二分图的最大匹配
//最大完全数:最大完全子图中顶点的个数 最大完全数=原图的补图的最大独立数
#include<iostream>
#include
<cstdio>
#include
<cstring>
#include
<string>
#define N 500
using namespace std;
int g,b, m, lin[N], count;
bool map[N][N],used[N];
bool search(int a){//判断是否能构成新的增广序列的函数
for(int j=1;j<=b;j++)
if(map[a][j] && !used[j]){//连通 没有用过
used[j] = 1;//标记
if(lin[j] == -1 || search(lin[j])){//无配对 或 构成增广序列
lin[j] = a;
return true;
}
}
return false;
}
int main(){
int t1,t2;
int moni = 1;
while(1){
scanf(
"%d %d %d",&g,&b,&m);
if(g==0) break;
count
= 0;
memset(map,
true, sizeof(map));
memset(lin,
-1, sizeof(lin));
//由于男生或者女生之间互相认识,又此处储存的是其补图,所以不做处理自然为互相不认识
for(int i=1;i<=m;i++){
scanf(
"%d %d", &t1,&t2);
map[t1][t2]
= false;
}
//匈牙利算法
for (int i=1;i<=g;i++){
memset(used,
false, sizeof(used));//每次对循环中的used进行初始化
if(search(i))
count
++;
}
printf(
"Case %d: %d\n",moni, g+b-count);
moni
++;
}
return 0;
}

抱歉!评论已关闭.