不错的一道题目,但是中途我还是出问题了,代码中有注释
代码如下:
1 #include <cstdio> 2 #include <cstring> 3 4 struct node 5 { 6 int x,y; 7 }ans[1005]; 8 9 int g[200][200]; 10 bool vis[200]; 11 int link[200]; 12 int match[200]; 13 int n; 14 15 void init() 16 { 17 memset(link, -1,sizeof(link)); 18 } 19 20 bool can(int x) 21 { 22 for(int i = 0;i < n;i ++) 23 { 24 if(g[i][x]&&!vis[i])//这里我用的是g[i][x],我要获得的是行的匹配的列的值 25 { 26 vis[i] = true; 27 if(link[i] == -1 || can(link[i])) 28 { 29 link[i] = x; 30 return true; 31 } 32 } 33 } 34 35 return false; 36 } 37 38 int maxmatch() 39 { 40 int num = 0; 41 for(int i = 0;i < n;i ++) 42 { 43 memset(vis,false,sizeof(vis)); 44 if(can(i)) 45 num++; 46 } 47 48 return num; 49 } 50 int main() 51 { 52 while(scanf("%d",&n) == 1) 53 { 54 init(); 55 for(int i = 0;i < n;i ++) 56 { 57 for(int j = 0;j < n;j ++) 58 { 59 scanf("%d",&g[i][j]); 60 } 61 } 62 63 if(maxmatch() != n) 64 { 65 printf("-1\n"); 66 } 67 else 68 { 69 int num = 0; 70 for(int i = 0;i < n;i ++) 71 { 72 if(link[i] != -1) 73 { 74 match[link[i]] = i;//列匹配行 75 } 76 } 77 int k = 0; 78 for(int i = 0;i < n;i ++) 79 { 80 if(link[i] != i) 81 { 82 ans[k].x = i + 1; 83 ans[k ++].y = link[i] + 1; 84 link[match[i]] = link[i]; 85 match[link[i]] = match[i];//坑啊,我就是这里忘记改变列匹配的值了,结果一直WA,还是看了别人的代码才知道的,呜呜 86 } 87 } 88 printf("%d\n",k); 89 for(int i = 0;i < k;i ++) 90 { 91 printf("C %d %d\n",ans[i].x,ans[i].y); 92 } 93 } 94 95 } 96 97 return 0; 98 }