標籤:des style http color os java io strong ar
奔小康賺大錢
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3707 Accepted Submission(s): 1618
Problem Description傳說在遙遠的地方有一個非常富裕的村落,有一天,村長決定進行制度改革:重新分配房子。
這可是一件大事,關係到人民的房屋問題啊。村裡共有n間房間,剛好有n家老百姓,考慮到每家都要有房住(如果有老百姓沒房子住的話,容易引起不安定因素),每家必須分配到一間房子且只能得到一間房子。
另一方面,村長和另外的村領導希望得到最大的效益,這樣村裡的機構才會有錢.由於老百姓都比較富裕,他們都能對每一間房子在他們的經濟範圍內出一定的價格,比如有3間房子,一家老百姓可以對第一間出10萬,對第2間出2萬,對第3間出20萬.(當然是在他們的經濟範圍內).現在這個問題就是村領導怎樣分配房子才能使收入最大.(村民即使有錢購買一間房子但不一定能買到,要看村領導分配的).
Input輸入資料包含多組測試案例,每組資料的第一行輸入n,表示房子的數量(也是老百姓家的數量),接下來有n行,每行n個數表示第i個村名對第j間房出的價格(n<=300)。
Output請對每組資料輸出最大的收入值,每組的輸出佔一行。
Sample Input
2100 1015 23
Sample Output
123
SourceHDOJ 2008 Summer Exercise(4)- Buffet Dinner AC代碼:
#include<stdio.h>#include<string>#include<iostream>#include<algorithm>using namespace std;int n;int w[305][305];int lx[305],ly[305],link[305];int s[305],t[305];int match(int i){ s[i]=1; for(int j=1;j<=n;j++){ if(lx[i]+ly[j]==w[i][j] && !t[j]){ t[j]=1; if(!link[j] || match(link[j])){ link[j]=i; return 1; } } } return 0;}void update(){ int a=1<<20; for(int i=1;i<=n;i++){ if(s[i]){ for(int j=1;j<=n;j++){ if(!t[j]){ a=min(a,lx[i]+ly[j]-w[i][j]); } } } } for(int i=1;i<=n;i++){ if(s[i]) lx[i]-=a; if(t[i]) ly[i]+=a; }}int KM(){ for(int i=1;i<=n;i++){ link[i]=lx[i]=ly[i]=0; for(int j=1;j<=n;j++){ lx[i]=max(lx[i],w[i][j]); } } for(int i=1;i<=n;i++){ while(1){ for(int j=1;j<=n;j++) s[j]=t[j]=0; if(match(i)) break; else update(); } } int ret=0; for(int i=1;i<=n;i++){ if(link[i]){ ret+=w[link[i]][i]; } } return ret;}int main(){ while(scanf("%d",&n)!=EOF){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&w[i][j]); int ans=KM(); printf("%d\n",ans); } return 0;}
hdu 2255(KM演算法模板)