雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

行列的二分图模型 最小点覆盖——pku3041

Posted on 2011-07-20 08:31  huhuuu  阅读(220)  评论(0编辑  收藏  举报
把行列转化为二分图
根据König定理:二分图 最小点覆盖数 = 最大匹配数
View Code
#include<stdio.h>
#include
<string.h>
bool map[505][505];
int mark[505];
bool flag[505];
int m;

bool dfs(int x)
{
int i;
for(i=1;i<=m;i++)
{
if(map[x][i]==0||flag[i]) continue;

flag[i]
=1;
if(mark[i]==0||dfs(mark[i]))
{
mark[i]
=x;
return 1;
}
}
return 0;
}

int main()
{
int i,g,k;
int count;
while(scanf("%d%d",&g,&k)!=EOF)
{
m
=g;
memset(map,
0,sizeof(map));

for(i=0;i<k;i++)
{
int x,y;
scanf(
"%d%d",&x,&y);
map[x][y]
=1;
}
memset(mark,
0,sizeof(mark));
count
=0;

for(i=1;i<=g;i++)
{
memset(flag,
0,sizeof(flag));

if(dfs(i)==1) count++;
}

printf(
"%d\n",count);
}
}