奔小康赚大钱

奔小康赚大钱

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5598    Accepted Submission(s): 2457

Problem Description

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

Input

输入数据包含多组测试用例,每组数据的第一行输入n,表示房子的数量(也是老百姓家的数量),接下来有n行,每行n个数表示第i个村名对第j间房出的价格(n<=300)。

Output

请对每组数据输出最大的收入值,每组的输出占一行。

Sample Input

2

100 10

15 23

Sample Output

123

Source

HDOJ 2008 Summer Exercise(4)- Buffet Dinner

题意:每家对每间房子有一个费用,怎么分配可以让总的费用最大。

KM

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5
 6 using namespace std;
 7
 8 #define N 330
 9 #define INF 0xfffffff
10
11 int n, s[N];
12 int lx[N], ly[N], maps[N][N], used[N], visx[N], visy[N];
13
14 int found(int u)
15 {
16     visx[u] = true;
17     for(int i = 1; i <= n; i++)
18     {
19         if(!visy[i] && lx[u] + ly[i] == maps[u][i])
20         {
21             visy[i] = 1;
22             if(!used[i] || found(used[i]))
23             {
24                 used[i] = u;
25                 return true;
26             }
27         }
28         else
29             s[i] = min(s[i], lx[u]+ly[i]-maps[u][i]);
30     }
31     return false;
32 }
33
34 int KM()
35 {
36     memset(used, 0, sizeof(used));
37     memset(lx, 0, sizeof(lx));
38     memset(ly, 0, sizeof(ly));
39
40     for(int i = 1; i <= n; i++)
41         for(int j = 1; j <= n; j++)
42         lx[i] = max(lx[i], maps[i][j]);   // 每个lx存的是可以的最大值,ly是0,相加就是自己所投的资金最大值。
43     for(int i = 1; i <= n; i++)
44     {
45         for(int j = 1; j <= n; j++)
46             s[j] = INF;
47         while(1)
48         {
49             memset(visx, 0, sizeof(visx));
50             memset(visy, 0, sizeof(visy));
51
52             if(found(i))
53                 break;
54             int d = INF;
55             for(int j = 1; j <= n; j++)
56                 if(!visy[j])
57                     d = min(d, s[j]);   // 如果找不到最大值匹配,就找需要减得最小值,让该匹配的减去最小值完成最大匹配
58             for(int j = 1; j <= n; j++)
59             {
60                 if(visx[j])
61                     lx[j] -= d;
62                 if(visy[j])
63                     ly[j] += d;
64             }
65         }
66     }
67     int ans = 0;
68     for(int i = 1; i <= n; i++)
69         ans += maps[used[i]][i];
70     return ans;
71 }
72
73 int main()
74 {
75     while(~scanf("%d", &n))
76     {
77         for(int i = 1; i <= n; i++)
78         {
79             for(int j = 1; j <= n; j++)
80             {
81                 scanf("%d", &maps[i][j]);
82             }
83         }
84         printf("%d\n", KM());
85     }
86     return 0;
87 }
时间: 2024-09-27 04:45:01

奔小康赚大钱的相关文章

奔小康赚大钱(km)

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

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

奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4211    Accepted Submission(s): 1825 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家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到

hdu2255 奔小康赚大钱 km算法解决最优匹配(最大权完美匹配)

/** 题目:hdu2255 奔小康赚大钱 km算法 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:lv 思路:最优匹配(最大权完美匹配) km算法 模板来自:http://www.cnblogs.com/wenruo/p/5264235.html 如果是求最小权完美匹配,那么将所有权值取相反数,然后求得最大权,输出最大权的相反数即可. */ #include <iostream> #include <cstring> #

HDU-2255 奔小康赚大钱(二分图、km算法、模板)

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

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

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

HDU2255 奔小康赚大钱 【二分图最佳匹配&#183;KM算法】

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

奔小康赚大钱(二分图最大权匹配)

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