hdu 2255(KM演算法模板)

來源:互聯網
上載者:User

標籤: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演算法模板)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.