POJ 2195 Going Home (最小費用最大流)

來源:互聯網
上載者:User

標籤:style   blog   http   os   io   strong   for   ar   


題目連結:http://poj.org/problem?id=2195


題意:n*m的矩陣,地圖上有若干個人(m)和房子(H),且人與房子的數量一致。man每移動一格費用為1,一個房子只能住一個人。現在要求所有的人出發,都入房屋子,求最少話費。


思路:建立一個超級源點和匯點,源點與人相連費用為0,容量為1,人與房子相連,費用為人與房子的距離,容量為1,房子與匯點相連,費用為0,容量為1



#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>const int maxn = 3010;const int maxm = 80000;const int inf = 1e8;#define MIN INT_MIN#define MAX 1e6#define LL long long#define init(a) memset(a,0,sizeof(a))#define FOR(i,a,b) for(int i = a;i<b;i++)#define max(a,b) (a>b)?(a):(b)#define min(a,b) (a>b)?(b):(a)using namespace std;struct node{    int u,v,w,cap,next;}edge[maxm];struct point{    int x,y;}M[110],H[110];int head[maxn],dis[maxn],pre[maxn];int cnt,n,Mnum,Hnum;bool vis[maxn];void add(int u,int v,int w,int cap){    edge[cnt].u = u;    edge[cnt].v = v;    edge[cnt].w = w;    edge[cnt].cap = cap;    edge[cnt].next = head[u];    head[u] = cnt++;    edge[cnt].u = v;    edge[cnt].v = u;    edge[cnt].w = -w;    edge[cnt].cap = 0;    edge[cnt].next = head[v];    head[v] = cnt++;}void initt(){    cnt = 0;    memset(head,-1,sizeof(head));    Mnum = 1;    Hnum = 1;}bool SPFA(int s,int t){    queue<int>q;    while(q.empty()==false) q.pop();    q.push(s);    init(vis);    memset(pre,-1,sizeof(pre));    FOR(i,s,t+1)    dis[i] = inf;    vis[s] = 1;    dis[s] = 0;    while(!q.empty())    {        int uu = q.front();        q.pop();        vis[uu] = 0;        for(int i = head[uu];i!=-1;i = edge[i].next)        {            if(edge[i].cap && dis[edge[i].v] > dis[uu] + edge[i].w)//找最小費用            {                dis[edge[i].v] = dis[uu] + edge[i].w;                pre[edge[i].v] = i;//記錄路徑                if(!vis[edge[i].v])                {                    vis[edge[i].v] = 1;                q.push(edge[i].v);                }            }        }    }    if(dis[t]!=inf)        return 1;    return 0;}int MinCostMaxFlow(int s,int t){    int flow = 0,cost = 0;//總流量、總費用    while(SPFA(s,t))    {        int df = inf;        for(int i = pre[t];i!=-1;i=pre[edge[i].u])        {            if(df > edge[i].cap)                df = edge[i].cap;        }        flow += df;//這條路徑的流量        for(int i = pre[t];i!=-1;i=pre[edge[i].u])//更新流量        {            edge[i].cap -= df;            edge[i^1].cap += df;        }        cost += df*dis[t];//單位費用誠意流量    }    return cost;}int main(){    int m,s,t;    char ma[110][110];    while(~scanf("%d%d",&n,&m))    {        if(n==0 && m==0) break;        initt();        FOR(i,0,n)        {            scanf("%*c%s",ma[i]);            FOR(j,0,m)            {                if(ma[i][j]=='m')                {                    M[Mnum].x = i;                    M[Mnum++].y = j;                }                else if(ma[i][j]=='H')                {                    H[Hnum].x = i;                    H[Hnum++].y = j;                }            }        }        Mnum--,Hnum--;        s = 0;        t = Mnum + Hnum + 1;       // printf("Mnum = %d  Hnum  =  %d   t = %d\n",Mnum,Hnum,t);        FOR(i,1,Mnum+1)        {            add(s,i,0,1);            FOR(j,1,Hnum+1)            {                int dd = abs(M[i].x - H[j].x) + abs(M[i].y - H[j].y);               // printf("dd = %d\n",dd);                add(i,Mnum+j,dd,1);                //printf("i->j %d->%d = %d\n",i,Mnum+j,dd);                //add(Mnum+j,t,0,1);            }        }        FOR(j,1,Hnum+1)       {           add(Mnum+j,t,0,1);               // printf("j->t = %d->%d\n",Mnum+j,t);       }       int ans =  MinCostMaxFlow(s,t);       cout<<ans<<endl;    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.