zoukankan      html  css  js  c++  java
  • hdu 2819【Swap】

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

    代码如下:
     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 }
  • 相关阅读:
    二柱子四则运算程序
    测绘软件使用感受
    二分图的最大匹配、完美匹配和匈牙利算法(转载)
    serialVersionUID的用处(转载)
    RMQ(模板)
    codeforces 825E
    红黑树
    SQL 范式(转载)
    java 移位运算
    [Hnoi2010]Bounce 弹飞绵羊
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2496232.html
Copyright © 2011-2022 走看看