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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj 2112 Optimal Milking(二分+Floyd+最大流)

發布時間:2025/3/16 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 2112 Optimal Milking(二分+Floyd+最大流) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:K個產奶機,C頭奶牛,每個產奶機最多可供M頭奶牛使用;并告訴了產奶機、奶牛之間的兩兩距離Dij(0<=i,j<K+C)。

問題:如何安排使得在任何一頭奶牛都有自己產奶機的條件下,奶牛到產奶機的最遠距離最短?最短是多少?

解題思路:首先用Floyd把兩兩之間的最小距離算出來,接下來二分枚舉最短距離limit,只要i,j兩點之間距離小于limit,連一條容量為1的邊,源點到產奶機的邊為M,限制了每個產奶機最多供M頭奶牛。奶牛到匯點的邊為1,表示每頭牛都有一個產奶機。

#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std;const int maxn = 250; const int inf = 0x3f3f3f3f; struct Edge {int to,next,flow; }edge[maxn*maxn]; int n,m,c,dis[maxn][maxn]; int head[maxn],cnt; int level[maxn],st,ed;void addedge(int u,int v,int flow) {edge[cnt].to = v;edge[cnt].flow = flow;edge[cnt].next = head[u];head[u] = cnt++;swap(u,v);edge[cnt].to = v;edge[cnt].flow = 0;edge[cnt].next = head[u];head[u] = cnt++; }void floyd() {for(int k = 1; k <= n + m; k++)for(int i = 1; i <= n + m; i++)for(int j = 1; j <= n + m; j++)dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]); }void build(int limit) {cnt = 0;memset(head,-1,sizeof(head));for(int i = 1; i <= n; i++)addedge(st,i,c);for(int i = n + 1; i <= n + m; i++)addedge(i,ed,1);for(int i = 1; i <= n; i++)for(int j = n + 1; j <= n + m; j++)if(dis[i][j] <= limit)addedge(i,j,1); }int BFS(int src,int des){queue<int> q;memset(level,0,sizeof(level));level[src] = 1;q.push(src);while(!q.empty()){int u = q.front();q.pop();if(u==des) return 1;for(int k = head[u];k!=-1;k=edge[k].next){int v = edge[k].to,w = edge[k].flow;if(level[v] == 0 && w != 0){level[v]=level[u]+1;q.push(v);}}}return -1; }int dfs(int u,int des,int increaseRoad){if(u == des) return increaseRoad;int ret = 0;for(int k=head[u];k!=-1;k=edge[k].next){int v = edge[k].to, w = edge[k].flow;if(level[v]==level[u]+1&&w!=0){int MIN = min(increaseRoad-ret,w);w = dfs(v,des,MIN);if(w > 0){edge[k].flow -=w;edge[k^1].flow +=w;ret += w;if(ret == increaseRoad) return ret;}else level[v] = -1; }}return ret; }int Dinic(int src,int des){int ans = 0;while(BFS(src,des)!=-1) ans += dfs(src,des,inf);return ans; }int main() {while(scanf("%d%d%d",&n,&m,&c)!=EOF){st = 0, ed = n + m + 1;for(int i = 1; i <= n + m; i++)for(int j = 1; j <= n + m; j++){scanf("%d",&dis[i][j]);if(dis[i][j] == 0)dis[i][j] = inf;}floyd();int l = 1,r = inf,mid,ans;while(l <= r){mid = (l + r) >> 1;build(mid);int tmp = Dinic(st,ed);if(tmp == m){ans = mid;r = mid - 1;}else l = mid + 1;}printf("%d\n",ans);}return 0; }

總結

以上是生活随笔為你收集整理的poj 2112 Optimal Milking(二分+Floyd+最大流)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。