Shirlies
宁静专注认真的程序媛~

不错的一道题目,但是中途我还是出问题了,代码中有注释

代码如下:
 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 }

 

posted on 2012-05-11 15:47  Shirlies  阅读(266)  评论(0编辑  收藏  举报