POJ--2112--Optimal Milking【Floyd+Dinic+二分答案】

來源:互聯網
上載者:User

標籤:網路最大流   二分答案   

連結:http://poj.org/problem?id=2112

題意:有k個擠奶器,編號1~k,c頭牛,編號k+1~k+c,每個擠奶器最多能給m頭牛擠奶,給你一個k+c的鄰接矩陣,要求每頭牛都能擠奶並且要求c頭牛需要走的所有路程中的最大路程最小,求這個最小的路。


思路:

1. 先用floyd處理出多源最短路

2. 用二分枚舉答案的可能,初始上限應該為(200+30)*200,但是我這麼開T了,可能因為代碼太挫,改到1000,卡著時間過了,只能說poj資料弱了。後來看別人的代碼,和我的做法一樣但是用了鄰接表,就能設上限為40000了。在二分中:

(1)構造容量網路,以0點為源點,到每頭牛的容量為1,以n+1點為匯點,每個擠奶器到匯點的容量為m,當然反過來也可以,因為源點和匯點的流量是相等的(等於c)。對於每頭牛和每個擠奶器之間的距離,如果比枚舉的距離還大,則容量為0,否則容量為1。

(2)Dinic找出網路最大流,很明顯最大流最大是c,當最大流是c的時候是一種答案,但不一定是最優,更新二分上限,如果最大流沒達到c,則更新下限。


#include<cstring>#include<string>#include<fstream>#include<iostream>#include<iomanip>#include<cstdio>#include<cctype>#include<algorithm>#include<queue>#include<map>#include<set>#include<vector>#include<stack>#include<ctime>#include<cstdlib>#include<functional>#include<cmath>using namespace std;#define PI acos(-1.0)#define MAXN 50100#define eps 1e-7#define INF 0x7FFFFFFF#define seed 131#define mod 1000000007#define ll long long#define ull unsigned ll#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int edge[300][300],customer[300][300];int vis[300],dist[300][300];int n,m,k,c;void floyd(){    int i,j,k;    for(k=1;k<=n;k++){        for(i=1;i<=n;i++){            for(j=1;j<=n;j++){                if(edge[i][k]!=INF&&edge[k][j]!=INF&&edge[i][k]+edge[k][j]<edge[i][j])                    edge[i][j] = edge[i][k] + edge[k][j];            }        }    }}void build_graph(int minm){    int i,j;    memset(customer,0,sizeof(customer));    for(i=1;i<=k;i++)   customer[i][n+1] = m;    for(i=k+1;i<=n;i++) customer[0][i] = 1;    for(i=k+1;i<=n;i++){        for(j=1;j<=k;j++){            if(edge[i][j]<=minm) customer[i][j] = 1;        }    }}int bfs(){    int i,j;    memset(vis,0,sizeof(vis));    memset(dist,0,sizeof(dist));    queue<int>q;    q.push(0);    vis[0] = 1;    while(!q.empty()){        int t = q.front();        q.pop();        for(i=0;i<=n+1;i++){            if(!vis[i]&&customer[t][i]){                vis[i] = 1;                dist[t][i] = 1;                q.push(i);            }        }    }    if(vis[n+1])    return 1;    else    return 0;}int dfs(int u,int delta){    int i,j,s;    if(u==n+1)  return delta;    s = delta;    for(i=0;i<=n+1;i++){        if(dist[u][i]){            int dd = dfs(i,min(customer[u][i],delta));            customer[u][i] -= dd;            customer[i][u] += dd;            delta -= dd;        }    }    return s - delta;}int main(){    int i,j;    while(scanf("%d%d%d",&k,&c,&m)!=EOF){        n = k + c;        for(i=1;i<=n;i++){            for(j=1;j<=n;j++){                scanf("%d",&edge[i][j]);                if(edge[i][j]==0)   edge[i][j] = INF;            }        }        floyd();        int mid, l = 0, r = 10000;        int sum;        while(l<r){            mid = (l+r)/2;            sum = 0;            build_graph(mid);            while(bfs())    sum += dfs(0,INF);            if(sum==c)  r = mid;            else    l = mid + 1;        }        printf("%d\n",l);    }    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.