HDU - 2255 奔小康赚大钱 (KM图) (KM图模板)
2017-09-22 00:14
351 查看
奔小康赚大钱
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10674 Accepted Submission(s): 4723
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
存一下模板QAQ
AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn=400; #define inf 1e7 struct KM { int w[maxn][maxn]; int ex_home[maxn]; int ex_people[maxn]; bool vis_home[maxn]; bool vis_people[maxn]; int match[maxn]; int slack[maxn]; int n; bool dfs(int v) { vis_people[v]=true; for(int home=0;home<n;home++) { if(vis_home[home])continue; int np=ex_home[home]+ex_people[v]-w[v][home]; if(np==0) { vis_home[home]=true; if(match[home]==-1||dfs(match[home])) { match[home]=v; return true; } } else { slack[home]=min(slack[home],np); } } return false; } int km() { memset(match,-1,sizeof(match)); memset(ex_home,0,sizeof(ex_home)); for(int i=0;i<n;i++) { ex_people[i]=w[i][0]; for(int j=0;j<n;j++) { ex_people[i]=max(ex_people[i],w[i][j]); } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { slack[j]=inf; } while(1) { memset(vis_home,0,sizeof(vis_home)); memset(vis_people,0,sizeof(vis_people)); if(dfs(i)) break; int d=inf; for(int j=0;j<n;j++) { if(!vis_home[j]) d=min(d,slack[j]); } for(int j=0;j<n;j++) { if(vis_home[j]) ex_home[j]+=d; else slack[j]-=d; if(vis_people[j]) ex_people[j]-=d; } } } int ans=0; for(int i=0;i<n;i++) { ans+=w[match[i]][i]; } return ans; } }T; int main() { while(scanf("%d",&T.n)==1) { for(int i=0;i<T.n;i++) { for(int j=0;j<T.n;j++) { scanf("%d",&T.w[i][j]); } } printf("%d\n",T.km()); } }
相关文章推荐
- hdoj 2255 奔小康赚大钱 (KM算法 详解+模板) && HDU 1533 Going Home (二分图最小权匹配 KM模板)纯模板
- HDU 2255 奔小康赚大钱 KM模板题
- HDU-2255 奔小康赚大钱 (KM模板)
- hdu 2255 - 奔小康赚大钱 ( km模板)
- hdu 2255 奔小康赚大钱【KM模板题】
- hdu 2255 奔小康赚大钱【KM模板题】
- HDU 2255 奔小康赚大钱(KM模板)
- hdu 2255 奔小康赚大钱 【km模板】
- hdu 2255 奔小康赚大钱 KM模板
- hdu 2255 奔小康赚大钱(KM模板题)
- 【KM模板】HDU 2255 奔小康赚大钱
- hdu 2255 奔小康赚大钱 KM模板题目
- hdu 2255 奔小康赚大钱(KM模板)
- hdu 2255 KM 奔小康赚大钱
- hdu 2255 奔小康赚大钱 最大权匹配KM
- HDU-2255-奔小康赚大钱(KM)
- HDU 2255 奔小康赚大钱(二分图最优匹配:模板题)
- HDU 2255 奔小康赚大钱(KM算法模板题)
- HDU 2255 奔小康赚大钱 (KM算法 模板题)
- HDU 2255 奔小康赚大钱 (km入门)