poj 2112 最大流 二分法

2021-07-15 16:23:42 字數 1068 閱讀 5287

安排c頭牛到某個擠奶器,使得每頭牛需要走的路程中最大路程的距離最小。

先用floyd演算法,求出奶牛到每個擠奶器的最短距離,然後從最大的距離二分,當此距離可以使c頭牛,匹配成功,就讓右區間r=mid;若不成功,就讓左區間l=mid;之後繼續二分。每次二分後,都要重新建圖,另外加超級源點s和超級匯點t,讓每頭牛與匯點建邊,容量為1,每個擠奶器與源點建邊,容量為m,擠奶器與奶牛的距離<=mid,就建容量為1的邊。之後用最大流演算法,即可。

#include 

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn = 500+10;

const int inf = 0x3f3f3f3f;

int dis[maxn][maxn];

int level[maxn];

int n, k, c, m;

struct node edge[maxn*maxn];

int head[maxn];

int cnt=0;

void init()

void add(int u, int v, int c)

void build(int dis)

}bool bfs() }}

return false;

}int dfs(int u, int minf)

}return ret;

}int dinic()

int main()

}for (int k=1; k<=n; k++)

}int l=0, r=300

*n; int ans=0;

while (r-l > 1)

else

l = mid;

}printf("%d\n", ans);

}return

0;}

poj 2112 最大流 二分

題意 有k臺擠奶機,c頭奶牛,給出這k c個實體間的距離,求出每頭奶牛都到一台擠奶機去,怎麼分配使奶牛走的最大距離最小。用二分列舉最大距離,include include define n 500 define inf 0x3fffffff int map n n dis n gap n head ...

poj2112 二分最大流

題目 輸入k c m 代表有k臺機器 c頭牛 每台機器最多服務m頭牛 k臺機器編號為1 k。c頭牛編號為k 1 k c 下面是乙個 k c k c 的矩陣 map i j 代表從編號為i的實體到編號為j的實體的直接距離 問你要讓每頭牛都被機器服務 這c頭牛中 走的最遠距離的最小值 就是說這c頭牛每頭...

POJ 2112 二分 最大流

題意 有k個牛奶機跟c頭牛。他們之間有路相連,農民想讓每個牛能到其中乙個牛奶機,又想讓走路最遠的牛走得最小。題解 求最大值最小,不出意外就是二分了 由於要限制總的路徑長度,就不能對每條邊限制了,於是先floyd求最短路,再二分最長路即可 不連大於二分值的路徑,連小於等於二分值的路徑,做最大流就好了 ...