【HDOJ】2255 奔小康赚大钱

最大二分图匹配,O(n^3).

 1 /* 2255 */
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cstring>
 6 #include <cstdlib>
 7 using namespace std;
 8
 9 #define MAXN 305
10 #define INF 0xfffffff
11
12 int w[MAXN][MAXN];
13 int link[MAXN];
14 int Lx[MAXN], Ly[MAXN];
15 int slack;
16 bool S[MAXN], T[MAXN];
17 int n;
18
19 bool dfs(int i) {
20     S[i] = true;
21     for (int j=1; j<=n; ++j) {
22         if (T[j])
23             continue;
24         int tmp = Lx[i]+Ly[j]-w[i][j];
25         if (tmp == 0) {
26             T[j] = true;
27             if (!link[j] || dfs(link[j])) {
28                 link[j] = i;
29                 return true;
30             }
31         } else if (slack > tmp) {
32             slack = tmp;
33         }
34     }
35     return false;
36 }
37
38 void update() {
39     for (int i=1; i<=n; ++i) {
40         if (S[i])    Lx[i] -= slack;
41         if (T[i])    Ly[i] += slack;
42     }
43 }
44
45 void KM() {
46     int i, j, k;
47
48     memset(link, 0, sizeof(link));
49     memset(Lx, 0, sizeof(Lx));
50     memset(Ly, 0, sizeof(Ly));
51     for (i=1; i<=n; ++i)
52         for (j=1; j<=n; ++j)
53             Lx[i] = max(Lx[i], w[i][j]);
54     for (i=1; i<=n; ++i) {
55         for (;;) {
56             memset(S, false, sizeof(S));
57             memset(T, false, sizeof(T));
58             slack = INF;
59             if (dfs(i))
60                 break;
61             else
62                 update();
63         }
64     }
65 }
66
67 int main() {
68     int i, j, k;
69     int ans;
70
71     #ifndef ONLINE_JUDGE
72         freopen("data.in", "r", stdin);
73     #endif
74
75     while (scanf("%d",&n)!=EOF) {
76         for (i=1; i<=n; ++i)
77             for (j=1; j<=n; ++j)
78                 scanf("%d", &w[i][j]);
79         KM();
80         for (ans=0,i=1; i<=n; ++i)
81             if (link[i])
82                 ans += w[link[i]][i];
83         printf("%d\n", ans);
84     }
85
86     return 0;
87 }
时间: 2024-08-01 16:27:26

【HDOJ】2255 奔小康赚大钱的相关文章

最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱

题目传送门 1 /* 2 KM:裸题第一道,好像就是hungary的升级版,不好理解,写点注释 3 KM算法用来解决最大权匹配问题: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接Xi,Yj有权w(i,j), 4 求一种匹配使得所有w(i,j)的和最大.也就是最大权匹配一定是完备匹配.如果两边的点数相等则是完美匹配. 5 如果点数不相等,其实可以虚拟一些点,使得点数相等,也成为了完美匹配.最大权匹配还可以用最大流去解决 6 */ 7 #include <cstdio> 8 #inc

hdu 2255 奔小康赚大钱(KM算法)

奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3248    Accepted Submission(s): 1413 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考

HDU 2255 ——奔小康赚大钱——————【KM算法裸题】

奔小康赚大钱 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2255 Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到

[ACM] HDU 2255 奔小康赚大钱 (二分图最大权匹配,KM算法)

奔小康赚大钱 Problem Description 传说在遥远的地方有一个很富裕的村落,有一天,村长决定进行制度改革:又一次分配房子. 这但是一件大事,关系到人民的住房问题啊. 村里共同拥有n间房间,刚好有n家老百姓,考虑到每家都要有房住(假设有老百姓没房子住的话.easy引起不安定因素),每家必须分配到一间房子且仅仅能得到一间房子. 还有一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.因为老百姓都比較富裕,他们都能对每一间房子在他们的经济范围内出一定的价格,比方有3间房

HDU 2255 奔小康赚大钱 (KM算法 模板)

A - 奔小康赚大钱 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子.

HDU 2255 奔小康赚大钱(二分匹配之KM算法)

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

HDU 2255 - 奔小康赚大钱

Kuhn - Munkres 算法,第一次拍各种问题,不过还是A掉了.. /* ID:esxgx1 LANG:C++ PROG:hdu2255 */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; #define LXN 307 #define RXN 307 int

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

题目链接:http://acm.acmcoder.com/showproblem.php?pid=2255 题意:中文 //KM算法模板题,用来测试一下模板 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #include <string> #include <functional&g

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

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