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 }