poj2112 網路流 二分 floyd

2021-09-06 20:21:59 字數 1799 閱讀 3768

描述

fj已將他的k(1 <= k <= 30)擠奶機搬到c(1 <= c <= 200)奶牛的奶牛牧場。一組不同長度的路徑在奶牛和擠奶機之間執行。擠奶機位置由id號1..k命名; 奶牛位置由id號k + 1..k + c命名。 

每個擠奶點每天可以「處理」最多m(1 <= m <= 15)的奶牛。 

編寫乙個程式,找到每頭牛到一些擠奶機的任務,以便最遠行走的奶牛行進的距離最小化(當然,擠奶機沒有過度使用)。對於所有輸入資料集,至少可以進行一次合法分配。奶牛可以在前往擠奶機的途中穿過幾條路徑。 

輸入

*第1行:帶有三個以空格分隔的整數的單行:k,c和m. 

*第2行......:這些k + c空格分隔整數的k + c行中的每一行描述了各種實體對之間的距離。輸入形成對稱矩陣。第2行說明從擠奶機1到每個其他實體的距離; 第3行告訴從機器2到每個其他實體的距離,依此類推。通過路徑直接連線的實體的距離是不大於200的正整數。不通過路徑直接連線的實體的距離為0.實體到其自身的距離(即對角線上的所有數字)也給出為0為了使輸入線保持合理的長度,當k + c> 15時,一行被分成15個數字的連續行和乙個可能更短的行來完成一行。每個新行都從它自己的行開始。 

產量

帶有單個整數的單行,是最遠行走牛的最小可能總距離。 

樣本輸入

2 3 2

0 3 2 1 1

3 0 3 2 0

2 3 0 1 0

1 2 1 0 2

1 0 0 2 0

樣本輸出

2
題意:

題意:

k個機器,每個機器最多服務m頭牛。

c頭牛,每個牛需要1臺機器來服務。

告訴你牛與機器(牛與牛,機器與機器)每個之間的直接距離。

問:讓所有的牛都被服務的情況下,使走的最遠的牛的距離最短,求這個距離。

分析:首先用floyd演算法求出任意兩點(牛或機器)之間的最短距離.

然後我們二分該距離,建立網路流圖.假設我們當前二分的距離為x.

首先是源點s到任意牛i之間有邊(s,i,1).   

然後是任意機器j到匯點t之間有邊(j,t,m).

然後對於任意牛i和機器j,如果他們之間的距離<=x,那麼就新增一條(i,j,1)的邊.

最終我們求最大流,看看最大流是否等於牛的數目c即可.

#include#include#include#include#include#define inf 1e9

using namespace std;

const int maxn=300+10;

struct edge

edge(int f,int t,int c,int fl):from(f),to(t),cap(c),flow(fl){}};

struct dinic}}

return vis[t];

}int dfs(int x,int a)

}return flow;

}int max_flow()

return ans;

}}dc;

int k,c,m;

int src,dst;

int dist[maxn][maxn];

void floyd(int n)

printf("%d\n",r);

}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求最短路,再二分最長路即可 不連大於二分值的路徑,連小於等於二分值的路徑,做最大流就好了 ...