hdu 2255 二分图最大权匹配 *

题意:说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子。
这可是一件大事,关系到人民的住房问题啊。村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓没房子住的话,容易引起不安定因素),每家必须分配到一间房子且只能得到一间房子。

一方面,村长和另外的村领导希望得到最大的效益,这样村里的机构才会有钱.由于老百姓都比较富裕,他们都能对每一间房子在他们的经济范围内出一定的价格,
比如有3间房子,一家老百姓可以对第一间出10万,对第2间出2万,对第3间出20万.(当然是在他们的经济范围内).现在这个问题就是村领导怎样分配房
子才能使收入最大.(村民即使有钱购买一间房子但不一定能买到,要看村领导分配的).

kuangbin模板题

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <iostream>
 5 using namespace std;
 6
 7 /*  KM算法
 8  *   复杂度O(nx*nx*ny)
 9  *  求最大权匹配
10  *   若求最小权匹配,可将权值取相反数,结果取相反数
11  *  点的编号从0开始
12  */
13 const int N = 310;
14 const int INF = 0x3f3f3f3f;
15 int nx,ny;//两边的点数
16 int g[N][N];//二分图描述
17 int linker[N],lx[N],ly[N];//y中各点匹配状态,x,y中的点标号
18 int slack[N];
19 bool visx[N],visy[N];
20
21 bool DFS(int x)
22 {
23     visx[x] = true;
24     for(int y = 0; y < ny; y++)
25     {
26         if(visy[y])continue;
27         int tmp = lx[x] + ly[y] - g[x][y];
28         if(tmp == 0)
29         {
30             visy[y] = true;
31             if(linker[y] == -1 || DFS(linker[y]))
32             {
33                 linker[y] = x;
34                 return true;
35             }
36         }
37         else if(slack[y] > tmp)
38             slack[y] = tmp;
39     }
40     return false;
41 }
42 int KM()
43 {
44     memset(linker,-1,sizeof(linker));
45     memset(ly,0,sizeof(ly));
46     for(int i = 0;i < nx;i++)
47     {
48         lx[i] = -INF;
49         for(int j = 0;j < ny;j++)
50             if(g[i][j] > lx[i])
51                 lx[i] = g[i][j];
52     }
53     for(int x = 0;x < nx;x++)
54     {
55         for(int i = 0;i < ny;i++)
56             slack[i] = INF;
57         while(true)
58         {
59             memset(visx,false,sizeof(visx));
60             memset(visy,false,sizeof(visy));
61             if(DFS(x))break;
62             int d = INF;
63             for(int i = 0;i < ny;i++)
64                 if(!visy[i] && d > slack[i])
65                     d = slack[i];
66             for(int i = 0;i < nx;i++)
67                 if(visx[i])
68                     lx[i] -= d;
69             for(int i = 0;i < ny;i++)
70             {
71                 if(visy[i])ly[i] += d;
72                 else slack[i] -= d;
73             }
74         }
75     }
76     int res = 0;
77     for(int i = 0;i < ny;i++)
78         if(linker[i] != -1)
79             res += g[linker[i]][i];
80     return res;
81 }
82 //HDU 2255
83 int main()
84 {
85     int n;
86     while(scanf("%d",&n) == 1)
87     {
88         for(int i = 0;i < n;i++)
89             for(int j = 0;j < n;j++)
90                 scanf("%d",&g[i][j]);
91         nx = ny = n;
92         printf("%d\n",KM());
93     }
94     return 0;
95 }
时间: 2024-10-13 21:01:46

hdu 2255 二分图最大权匹配 *的相关文章

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

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

HDU2255 奔小康赚大钱 —— 二分图最大权匹配

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11022    Accepted Submission(s): 4877 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行

POJ2195 Going Home[费用流|二分图最大权匹配]

Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22088   Accepted: 11155 Description On a grid map there are n little men and n houses. In each unit time, every little man can move one unit step, either horizontally, or vertica

hdu 2255 二分图带权匹配 模板题

模板+注解在 http://blog.csdn.net/u011026968/article/details/38276945 hdu 2255 代码: //KM×î´ó×îСƥÅä #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; #define INF 0x0fffffff const int MAXN

[hdu1533]二分图最大权匹配 || 最小费用最大流

题意:给一个n*m的地图,'m'表示人,'H'表示房子,求所有人都回到房子所走的距离之和的最小值(距离为曼哈顿距离). 思路:比较明显的二分图最大权匹配模型,将每个人向房子连一条边,边权为曼哈顿距离的相反数(由于是求最小,所以先取反后求最大,最后再取反回来即可),然后用KM算法跑一遍然后取反就是答案.还可以用最小费用最大流做,方法是:从源点向每个人连一条边,容量为1,费用为0,从每个房子向汇点连一条边,容量为1,费用为0,从每个人向每个房子连一条边,容量为1,费用为曼哈顿距离的值,建好图后跑一遍

ural 1076 Trash 二分图最大权匹配(费用流实现)

统计每种垃圾的总和,若将K种垃圾倒入第F个垃圾桶,那么花费就是K-F(k)  (自己已经有的垃圾不用倒). 然后就是简单的二分图建图. #include<cstdio> #include<queue> #include<algorithm> #include<cstring> using namespace std; #define MAXN 1000 #define MAXM 1000000 #define INF 0x3f3f3f3f struct no

二分图最大权匹配(KM算法)

#80. 二分图最大权匹配 统计 描述 提交 自定义测试 从前一个和谐的班级,有 $n_l$ 个是男生,有 $n_r$ 个是女生.编号分别为 $1, \dots, n_l$ 和 $1, \dots, n_r$. 有若干个这样的条件:第 $v$ 个男生和第 $u$ 个女生愿意结为配偶,且结为配偶后幸福程度为 $w$. 请问这个班级里幸福程度之和最大是多少? 输入格式 第一行三个正整数,$n_l, n_r, m$. 接下来 $m$ 行,每行三个整数 $v, u, w$ 表示第 $v$ 个男生和第 $

[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

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

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