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