日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

奔小康赚大钱(HDU-2255)

發(fā)布時(shí)間:2025/3/17 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 奔小康赚大钱(HDU-2255) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Problem Description

傳說在遙遠(yuǎn)的地方有一個(gè)非常富裕的村落,有一天,村長決定進(jìn)行制度改革:重新分配房子。
這可是一件大事,關(guān)系到人民的住房問題啊。村里共有n間房間,剛好有n家老百姓,考慮到每家都要有房住(如果有老百姓沒房子住的話,容易引起不安定因素),每家必須分配到一間房子且只能得到一間房子。
另一方面,村長和另外的村領(lǐng)導(dǎo)希望得到最大的效益,這樣村里的機(jī)構(gòu)才會有錢.由于老百姓都比較富裕,他們都能對每一間房子在他們的經(jīng)濟(jì)范圍內(nèi)出一定的價(jià)格,比如有3間房子,一家老百姓可以對第一間出10萬,對第2間出2萬,對第3間出20萬.(當(dāng)然是在他們的經(jīng)濟(jì)范圍內(nèi)).現(xiàn)在這個(gè)問題就是村領(lǐng)導(dǎo)怎樣分配房子才能使收入最大.(村民即使有錢購買一間房子但不一定能買到,要看村領(lǐng)導(dǎo)分配的).

Input

輸入數(shù)據(jù)包含多組測試用例,每組數(shù)據(jù)的第一行輸入n,表示房子的數(shù)量(也是老百姓家的數(shù)量),接下來有n行,每行n個(gè)數(shù)表示第i個(gè)村名對第j間房出的價(jià)格(n<=300)。

Output

請對每組數(shù)據(jù)輸出最大的收入值,每組的輸出占一行。

Sample Input

2
100 10
15 23

Sample Output

123

題意:?給你一個(gè)帶權(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。