zoukankan      html  css  js  c++  java
  • Hdu 3395 【最大权值匹配】.cpp

    题意:

    有一种奇怪的小鱼..

    他会攻击他认为是女的鱼..<如果她自己也是女的呢?不懂..果然是奇怪的小鱼..>

    然后生下来的孩子的值等于父母值的异或结果..<更奇怪了..囧~>

    问最可能得到的孩子值最大是多少~

     

    输入:

      一个n代表有n条鱼

      接下来1行有n个数表示第i条鱼的值

      然后n*n行~表示第i行的鱼认为第j行的鱼是女的鱼

     

    思路:

      根据给出的n*n矩阵~

      得出第i个点对应第j个点..即ij连边的值wij..

      然后转化为求最佳匹配<最大边权匹配>

     

    Tips:

      读入数据的时候要以字符串的形式..

      坦白说我到现在都没理解一个一个字符读的话为什么会wa..

      求解..

      传说.. 是因为windows系统换行符是两个字符..

      所以一个getchar()就会错~

      以后都用字符串处理吧.. 

     

    Code:

    View Code
      1 #include <stdio.h>
      2 #include <cstring>
      3 #include <algorithm>
      4 #include <cmath>
      5 using namespace std;
      6 #define clr(x) memset(x, 0, sizeof(x))
      7 #define M 210
      8 const int INF = 0x1f1f1f1f;
      9 
     10 int v;
     11 int link[M], lx[M], ly[M];
     12 int visx[M], visy[M], G[M][M];
     13 int slack;
     14 int DFS(int x)
     15 {
     16     visx[x] = 1;
     17     for (int y = 1; y <= v; ++y)
     18     {
     19         if (visy[y])
     20             continue;
     21         int t = lx[x] + ly[y] - G[x][y];
     22         if (t == 0)
     23         {
     24             visy[y] = 1;
     25             if (link[y] == -1||DFS(link[y]))
     26             {
     27                 link[y] = x;
     28                 return 1;
     29             }
     30         }
     31         else if (slack > t)
     32             slack = t;
     33     }
     34     return 0;
     35 }
     36 
     37 int KM()
     38 {
     39     int i,j;
     40     memset (link,-1,sizeof(link));
     41     memset (ly,0,sizeof(ly));
     42     for (i = 1;i <= v; ++i)
     43         for (j = 1,lx[i] = -INF;j <= v; ++j)
     44             if (G[i][j] > lx[i])
     45                 lx[i] = G[i][j];
     46 
     47     for (int x = 1;x <= v; ++x)
     48     {
     49         memset(visx,0,sizeof(visx));
     50         memset(visy,0,sizeof(visy));
     51         while (1)
     52         {
     53             slack=INF;
     54             if (DFS(x))
     55                 break;
     56             for(i = 1; i <= v; i++)
     57             {
     58                 if(visx[i]) {  lx[i]-=slack;  visx[i]=0;  }
     59                 if(visy[i]) {  ly[i]+=slack;  visy[i]=0;  }
     60             }
     61 
     62         }
     63     }
     64     int res = 0;
     65     for (i = 1;i <= v; ++i)
     66             res += G[link[i]][i];
     67     return res;
     68 }
     69 
     70 
     71 int main()
     72 {
     73     int i, j, k;
     74     int n, val[110];
     75     char w[110];
     76     while(scanf("%d", &n) != EOF)
     77     {
     78         if(n == 0) break;
     79         clr(G);
     80         v = n;
     81 
     82         for(i = 1; i <= n; ++i)
     83         scanf("%d", &val[i]);
     84 
     85 /*
     86         for(i = 1; i <= n; ++i) {
     87             getchar();
     88             for(j = 1; j <= n; ++j) {
     89                 scanf("%c", &w);
     90                 if(w == '1') G[i][j] = val[i]^val[j];
     91             }
     92         }
     93 */
     94 
     95         for(i = 1; i <= n; ++i) {
     96             scanf("%s", w+1);
     97             for(j = 1; j <= n; ++j)
     98                 if(w[j]-'0') G[i][j] = val[i]^val[j];
     99         }
    100 
    101         int ans = KM();
    102         printf("%d\n", ans);
    103     }
    104     return 0;
    105 }

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3395

  • 相关阅读:
    Linux 下 MQ 的安装
    云计算的三种服务模式:IaaS,PaaS和SaaS
    Mac下安装Maven
    JDK Mac 安装
    Mac OS 终端利器 iTerm2
    单元测试用例规范
    boolean 属性的定义规范
    2019-12-9号 终于入职 阿里巴巴
    远程调试方法
    系统提测及上线规范(系统上线必读!)
  • 原文地址:https://www.cnblogs.com/Griselda/p/2710291.html
Copyright © 2011-2022 走看看