hdu1498

来源:互联网 发布:python中文文档下载 编辑:程序博客网 时间:2024/05/20 21:47
/*
分析:
    又一个0MS,0.0I,真假~
    最小顶点覆盖,只是要多求几次而已。


                      2012-08-03 14:19
*/









#include"stdio.h"#include"string.h"struct A{int tot;int mem[111];}E[55][111];int num[55];int match[111];int visit[111];int map[111][111];int yes[55];int DFS(int z,int k){int i;int temp;for(i=0;i<E[z][k].tot;i++){temp=E[z][k].mem[i];if(visit[temp])continue;visit[temp]=1;if(match[temp]==-1 || DFS(z,match[temp])){match[temp]=k;return 1;}}return 0;}int main(){int n,m;int z,i,l;int ans;int count;while(scanf("%d%d",&n,&m),n||m){memset(num,0,sizeof(num));for(i=1;i<=n;i++)for(l=1;l<=n;l++){scanf("%d",&map[i][l]);num[map[i][l]]++;}for(i=1;i<=50;i++)for(l=1;l<=n;l++)E[i][l].tot=0;for(i=1;i<=n;i++)for(l=1;l<=n;l++)E[map[i][l]][i].mem[E[map[i][l]][i].tot++]=l;memset(yes,0,sizeof(yes));for(z=1;z<=50;z++){if(num[z]==0)continue;ans=0;memset(match,-1,sizeof(match));for(i=1;i<=n;i++){if(E[z][i].tot==0)continue;memset(visit,0,sizeof(visit));ans+=DFS(z,i);}if(ans>m)yes[z]=1;}count=0;for(i=1;i<=50;i++)if(yes[i])count++;if(!count)printf("-1\n");else{for(i=1;i<=50;i++)if(yes[i]){printf("%d",i);break;}for(i++;i<=50;i++)if(yes[i])printf(" %d",i);printf("\n");}}return 0;}