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\n",KM());
95     }
96     return 0;
97 }

时间: 2025-01-01 16:25:15

HDU 3395 Special Fish【最大权匹配】的相关文章

HDU 3395 Special Fish 最“大”费用最大流

求最大费用可以将边权取负以转化成求最小费用.然而此时依然不对,因为会优先寻找最大流,但是答案并不一定出现在满流的时候.所以要加一些边(下图中的红边)使其在答案出现时满流.设所有边的流量为1,花费如下图所示.显然最大花费是1001,而没有红边的情况下会得到3. #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio>

[ACM] HDU 3395 Special Fish (二分图最大权匹配,KM算法)

Special Fish Problem Description There is a kind of special fish in the East Lake where is closed to campus of Wuhan University. It's hard to say which gender of those fish are, because every fish believes itself as a male, and it may attack one of s

HDU 3395 Special Fish(拆点+最大费用最大流)

Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2367    Accepted Submission(s): 878 Problem Description There is a kind of special fish in the East Lake where is closed to campus o

HDU 3395 Special Fish(费用流)

题目地址:HDU 3395 刷了几道白书和CF上的非算法的智商题,感觉智商越来越接近负数了...还是先刷几道简单题缓缓.. 这题很简单,二分图模型,用费用流也可以,用KM也可以.不过需要注意的是这里是最大费用流,并不是最大费用最大流,区别在于是否是最大流,这题可以不是最大流,所以要当费用开始减少的时候停止继续流,来保证费用是最大的. 代码如下: #include <iostream> #include <cstdio> #include <string> #includ

HDU 3395 Special Fish(最大费用流)

Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1814    Accepted Submission(s): 678 Problem Description There is a kind of special fish in the East Lake where is closed to campus o

hdoj 3395 Special Fish 【最大费用流】

Special Fish Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1920    Accepted Submission(s): 717 Problem Description There is a kind of special fish in the East Lake where is closed to campus o

HDU3359 Special Fish (KM匹配)

题意:告诉任意两个鱼之间的关系,然后,两条有关系的鱼的权值异或就是 spawn的值,求所有spawn和的最大值. 思路:预处理好任意两条鱼的spawn的值,KM匹配一下即可. #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<set> #include<map> #include<string> #include

hdu 2255 二分图最大权匹配 *

题意:说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子.另 一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济范围内出一定的价格, 比如有3间房子,一家老百姓可以对第一间出10万,对第2间出2万,对第3间出2

hdu 2255 奔小康赚大钱 最大权匹配KM

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子.另一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济