Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

http://acm.hdu.edu.cn/showproblem.php?pid=1498

最小点覆盖

View Code
 1 //1498
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 
 6 const int N=110;
 7 int g[N][N],n;
 8 int mat[N],vis[N];
 9 bool find(int u,int c)
10 {
11     for(int v=0;v<n;v++)
12         if(g[u][v]==c && !vis[v])
13         {
14             vis[v]=1;
15             if(mat[v]==-1 || find(mat[v],c))
16             {
17                 mat[v]=u;
18                 return 1;
19             }
20         }
21     return 0;
22 }
23 int maxmatch(int c)
24 {
25     int cnt=0;
26     memset(mat,-1,sizeof(mat));
27     for(int i=0;i<n;i++)
28     {
29         memset(vis,0,sizeof(vis));
30         if(find(i,c)) cnt++;
31     }
32     return cnt;
33 }
34 int main()
35 {
36     int k;
37     while(scanf("%d%d",&n,&k),n)
38     {
39         memset(g,0,sizeof(g));
40         for(int i=0;i<n;i++)
41             for(int j=0;j<n;j++) scanf("%d",&g[i][j]);
42         int flag=1;
43         for(int c=1;c<=50;c++)
44         {
45             int max=maxmatch(c);
46             if(max>k)
47             {
48                 if(flag)
49                 {
50                     flag=0;
51                     printf("%d",c);
52                 }
53                 else printf(" %d",c);
54             }
55         }
56         if(flag) printf("-1");
57         printf("\n");
58     }
59     return 0;
60 }

 

posted on 2012-04-17 13:20  Qiuqiqiu  阅读(162)  评论(0编辑  收藏  举报