hdu 2255 奔小康赚大钱 (KM)
Posted getcharzp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 2255 奔小康赚大钱 (KM)相关的知识,希望对你有一定的参考价值。
奔小康赚大钱
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13660 Accepted Submission(s): 5961
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13660 Accepted Submission(s): 5961
Problem Description
传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子。
这可是一件大事,关系到人民的住房问题啊。村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子。
另一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济范围内出一定的价格,比如有3间房子,一家老百姓可以对第一间出10万,对第2间出2万,对第3间出20万.(当然是在他们的经济范围内).现在这个问题就是村领导怎样分配房子才能使收入最大.(村民即使有钱购买一间房子但不一定能买到,要看村领导分配的).
Input
输入数据包含多组测试用例,每组数据的第一行输入n,表示房子的数量(也是老百姓家的数量),接下来有n行,每行n个数表示第i个村名对第j间房出的价格(n<=300)。
输入数据包含多组测试用例,每组数据的第一行输入n,表示房子的数量(也是老百姓家的数量),接下来有n行,每行n个数表示第i个村名对第j间房出的价格(n<=300)。
Output
请对每组数据输出最大的收入值,每组的输出占一行。
请对每组数据输出最大的收入值,每组的输出占一行。
Sample Input
2
100 10
15 23
2
100 10
15 23
Sample Output
123
123
C/C++:
1 #include <map> 2 #include <queue> 3 #include <cmath> 4 #include <vector> 5 #include <string> 6 #include <cstdio> 7 #include <cstring> 8 #include <climits> 9 #include <iostream> 10 #include <algorithm> 11 #define INF 0x3f3f3f3f 12 using namespace std; 13 const int my_max = 310; 14 15 int n, nx, ny, my_map[my_max][my_max], my_lx[my_max], my_line[my_max], 16 my_slack[my_max], my_bookx[my_max], my_booky[my_max], my_ly[my_max]; 17 18 bool my_dfs(int x) 19 { 20 my_bookx[x] = 1; 21 for (int i = 1; i <= ny; ++ i) 22 { 23 if (my_booky[i]) continue; 24 int temp = my_lx[x] + my_ly[i] - my_map[x][i]; 25 if (temp == 0) 26 { 27 my_booky[i] = 1; 28 if (!my_line[i] || my_dfs(my_line[i])) 29 { 30 my_line[i] = x; 31 return true; 32 } 33 } 34 else if (my_slack[i] > temp) 35 my_slack[i] = temp; 36 } 37 return false; 38 } 39 40 int my_km() 41 { 42 memset(my_lx, 0, sizeof(my_lx)); 43 memset(my_line, 0, sizeof(my_line)); 44 45 for (int i = 1; i <= nx; ++ i) 46 for (int j = 1; j <= ny; ++ j) 47 if (my_map[i][j] > my_lx[i]) 48 my_lx[i] = my_map[i][j]; 49 50 for (int i = 1; i <= nx; ++ i) 51 { 52 for (int j = 1; j <= ny; ++ j) 53 my_slack[j] = INF; 54 while (1) 55 { 56 memset(my_bookx, 0, sizeof(my_bookx)); 57 memset(my_booky, 0, sizeof(my_booky)); 58 59 if (my_dfs(i)) break; 60 61 int my_temp_min = INF; 62 for (int j = 1; j <= ny; ++ j) 63 if (!my_booky[j] && my_slack[j] < my_temp_min) 64 my_temp_min = my_slack[j]; 65 66 for (int j = 1; j <= nx; ++ j) 67 if (my_bookx[j]) my_lx[j] -= my_temp_min; 68 for (int j = 1; j <= ny; ++ j) 69 if (my_booky[j]) my_ly[j] += my_temp_min; 70 else my_slack[j] -= my_temp_min; 71 } 72 } 73 int my_ans = 0; 74 for (int i = 1; i <= ny; ++ i) 75 my_ans += my_map[my_line[i]][i]; 76 return my_ans; 77 } 78 79 int main() 80 { 81 while (~scanf("%d", &n)) 82 { 83 nx = ny = n; 84 for (int i = 1; i <= n; ++ i) 85 for (int j = 1; j <= n; ++ j) 86 scanf("%d", &my_map[i][j]); 87 printf("%d ", my_km()); 88 } 89 return 0; 90 }
引之:https://www.cnblogs.com/jackge/archive/2013/05/03/3057028.html
以上是关于hdu 2255 奔小康赚大钱 (KM)的主要内容,如果未能解决你的问题,请参考以下文章