奔小康赚大钱(HDU-2255)
Problem Description
傳說在遙遠(yuǎn)的地方有一個非常富裕的村落,有一天,村長決定進(jìn)行制度改革:重新分配房子。
這可是一件大事,關(guān)系到人民的住房問題啊。村里共有n間房間,剛好有n家老百姓,考慮到每家都要有房住(如果有老百姓沒房子住的話,容易引起不安定因素),每家必須分配到一間房子且只能得到一間房子。
另一方面,村長和另外的村領(lǐng)導(dǎo)希望得到最大的效益,這樣村里的機(jī)構(gòu)才會有錢.由于老百姓都比較富裕,他們都能對每一間房子在他們的經(jīng)濟(jì)范圍內(nèi)出一定的價格,比如有3間房子,一家老百姓可以對第一間出10萬,對第2間出2萬,對第3間出20萬.(當(dāng)然是在他們的經(jīng)濟(jì)范圍內(nèi)).現(xiàn)在這個問題就是村領(lǐng)導(dǎo)怎樣分配房子才能使收入最大.(村民即使有錢購買一間房子但不一定能買到,要看村領(lǐng)導(dǎo)分配的).
Input
輸入數(shù)據(jù)包含多組測試用例,每組數(shù)據(jù)的第一行輸入n,表示房子的數(shù)量(也是老百姓家的數(shù)量),接下來有n行,每行n個數(shù)表示第i個村名對第j間房出的價格(n<=300)。
Output
請對每組數(shù)據(jù)輸出最大的收入值,每組的輸出占一行。
Sample Input
2
100 10
15 23
Sample Output
123
題意:?給你一個帶權(quán)的二分圖,求該二分圖的最優(yōu)匹配權(quán)值
思路:左點(diǎn)集代表村名,右點(diǎn)集代表房子,最優(yōu)匹配 KM 模板題。。。
Source Program
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #define PI acos(-1.0) #define E 1e-6 #define MOD 16007 #define INF 0x3f3f3f3f #define N 1001 #define LL long long using namespace std; int n; int G[N][N]; int Lx[N],Ly[N]; bool visX[N],visY[N]; int linkX[N],linkY[N]; bool dfs(int x){visX[x]=true;for(int y=1;y<=n;y++){if(!visY[y]){int temp=Lx[x]+Ly[y]-G[x][y];if(temp==0){visY[y]=true;if(linkY[y]==-1 || dfs(linkY[y])){linkX[x]=y;linkY[y]=x;return true;}}}}return false; } void update(){int minn=INF;for(int i=1;i<=n;i++)if(visX[i])for(int j=1;j<=n;j++)if(!visY[j])minn=min(minn,Lx[i]+Ly[j]-G[i][j]);for(int i=1;i<=n;i++){if(visX[i])Lx[i]-=minn;if(visY[i])Ly[i]+=minn;} } int KM(){memset(linkX,-1,sizeof(linkX));memset(linkY,-1,sizeof(linkY));for(int i=1;i<=n;i++){while(true){memset(visX,false,sizeof(visX));memset(visY,false,sizeof(visY));if(dfs(i))break;elseupdate();}}int ans=0;for(int i=1;i<=n;i++)ans+=G[linkY[i]][i];return ans; } int main(){while(scanf("%d",&n)!=EOF&&(n)){for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&G[i][j]);printf("%d\n",KM());}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的奔小康赚大钱(HDU-2255)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 八皇后(信息学奥赛一本通-T1214)
- 下一篇: 数列分段Section I(洛谷-P11