3月30日 二分图最大匹配模板题
https://uoj.ac/problem/78
#include<cstdio>
#include<cstring>
int girls[501],boys[501],map[501][501],nx,ny,waitings[501];
void clear()
{
memset(girls,0,sizeof(int));
memset(boys,0,sizeof(int));
memset(map,0,sizeof(int));
memset(waitings,0,sizeof(int));
}
int dfs(int x)//其实这一段才是重点,侧重一个”腾“字
{
int temp=0,t;
for(int i=1;i<=ny;i++)
if(map[x][i]==1&&!waitings[i])//waitings表示曾经试过的,就不试了
{
waitings[i]=1;
if(boys[i]&&dfs(boys[i])||!boys[i])
{
girls[x]=i,boys[i]=x;
return 1;
}
}
return 0;
}
int main()
{
int m,c=0;
scanf("%d%d%d",&nx,&ny,&m);
clear();
int temp1,temp2;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&temp1,&temp2);
map[temp1][temp2]=1;
}
for(int i=1;i<=nx;i++)
{
if(dfs(i)) c++;
memset(waitings,0,sizeof(waitings));
}
printf("%d\n",c);
for(int i=1;i<=nx;i++)
printf("%d ",girls[i]);
}
//昨晚写的45个点只过了9个,没有改完就睡了,睡前看了一下别人的程序,哇塞好短,大概是我自己想复杂了。这是一个好的开始。
评论(1)