跟朋友聊天聊得正酣,手里的代码完成,测试通过,提交1A。
“二分图匹配不难,难的是你得看出来它是二分图匹配。”yyf以前经常念叨这句话,我好像有点儿懂了。
#include<stdio.h>
#include<string.h>
#define N 105
#define M 55
int map[N][N],mark[N],link[N];
int a[M],b[M];
int n,m,k;
int dfs(int x)
{
int i;
for(i=1;i<=n;i++)
{
if(map[x][i]==m&&mark[i]==-1)
{
mark[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d%d",&n,&k),n+k)
{
int i,j;
memset(mark,0,sizeof(mark));
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
a[map[i][j]]++;
}
}
int l;
l=0;
for(i=1;i<=50;i++)
{
if(a[i]!=0)
{
m=i;
memset(link,-1,sizeof(link));
int temp;
temp=0;
for(j=1;j<=n;j++)
{
memset(mark,-1,sizeof(mark));
if(dfs(j))
temp++;
}
if(temp>k)
b[l++]=i;
}
}
if(l==0)
printf("-1\n");
else
{
printf("%d",b[0]);
for(i=1;i<l;i++)
printf(" %d",b[i]);
printf("\n");
}
}
return 0;
}