zoukankan      html  css  js  c++  java
  • HDU 3395 Special Fish【最大权匹配】

    题意:最大权匹配

    分析:最大全匹配

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 
     6 const int maxn = 105;
     7 const int INF = 2000000000;
     8 
     9 bool Sx[maxn], Sy[maxn];
    10 int Lx[maxn], Ly[maxn];
    11 int Link[maxn];
    12 int W[maxn][maxn];
    13 int n, m;
    14 
    15 bool Find(int i) {
    16     Sx[i] = true;
    17     for(int j = 1; j <= m; j++) {
    18         if(!Sy[j] && Lx[i] + Ly[j] == W[i][j]) {
    19             Sy[j] = true;
    20             if(Link[j] == 0 || Find(Link[j])) {
    21                 Link[j] = i;
    22                 return true;
    23             }
    24         }
    25     }
    26     return false;
    27 }
    28 
    29 int KM() {
    30     for(int i = 1; i <= n;i++) {
    31         Lx[i] = 0;
    32         for(int j = 1; j <= m; j++) {
    33             Lx[i] = max(Lx[i], W[i][j]);
    34         }
    35     }
    36     memset(Ly, 0, sizeof(Ly));
    37     memset(Link, 0, sizeof(Link));
    38     for(int v = 1; v <= n; v++) {
    39         memset(Sx, 0, sizeof(Sx));
    40         memset(Sy, 0, sizeof(Sy));
    41         while(1) {
    42             if(Find(v)) break;
    43             int dmin = INF;
    44             for(int i = 1; i <= n; i++) {
    45                 if(Sx[i]) {
    46                     for(int j = 1; j <= m; j++) {
    47                         if(!Sy[j] && Lx[i] + Ly[j] - W[i][j] < dmin) {
    48                             dmin = Lx[i] + Ly[j] - W[i][j];
    49                         }
    50                     }
    51                 }
    52             }
    53             for(int i = 1; i <= n; i++) {
    54                 if(Sx[i]) {
    55                     Lx[i] -= dmin;
    56                     Sx[i] = 0;
    57                 }
    58             }
    59             for(int i = 1; i <= m; i++) {
    60                 if(Sy[i]) {
    61                     Ly[i] += dmin;
    62                     Sy[i] = 0;
    63                 }
    64             }
    65         }
    66     }
    67     int sum = 0;
    68     for(int i = 1; i <= n; i++) {
    69         sum += W[Link[i]][i];
    70     }
    71     return sum;
    72 }
    73 
    74 int val[maxn];
    75 char mat[maxn][maxn];
    76 int main() {
    77     while(scanf("%d",&n) && n) {
    78         memset(W, 0, sizeof(W));
    79         for(int i = 1; i <= n; i++) {
    80             scanf("%d",&val[i]);
    81         }
    82         for(int i = 1; i <= n; i++) {
    83             scanf("%s",mat[i]);
    84         }
    85         for(int i = 1; i <= n; i++) {
    86             for(int j = 0; j < n; j++) {
    87                 if(i == j + 1) continue;
    88                 if(mat[i][j] == '1') {
    89                     W[i][j + 1] = val[i] ^ val[j + 1];
    90                 }
    91             }
    92         }
    93         m = n;
    94         printf("%d
    ",KM());
    95     }
    96     return 0;
    97 }
    View Code
  • 相关阅读:
    vscode source control provider not registered
    MAC NVM 安装
    《高效前端:Web 高效编程与优化实践》学习笔记
    回显服务端/client
    图像处理系列(1):測地线动态轮廓(geodesic active contour)
    Pro Android学习笔记(一三八):Home Screen Widgets(4):App Widget Provider
    怎样传输SE63的翻译内容
    <html>
    概率dp sgu495
    Android Afinal框架学习(一) FinalDb 数据库操作
  • 原文地址:https://www.cnblogs.com/zhanzhao/p/3938427.html
Copyright © 2011-2022 走看看