poj2112 二分最大流

2021-08-05 18:36:20 字數 1463 閱讀 1729

題目:

輸入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頭牛每頭牛都要走向乙個機器,最小化走的最遠的那頭牛所走的距離)

思路:二分最遠的距離mid  如果機器和牛之間的最短距離(最短距離用floyd演算法更新即可)小於mid 那麼就可以建邊(從機器到牛加一條邊 權值為1)

然後建立乙個超級源點 源點向每台機器建邊 權值為m 

建立乙個超級匯點 每頭牛都向匯點建邊 權值為1

最後跑最大流 看最大流是否等於c

若等於則還有減小距離的餘地 不等於的話就得增大距離了

#include#include#include#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

int k,c,m;

int a[233][233];//存矩陣

int num;

const int maxn=233;

const int maxm=40010;

const int inf=0x3f3f3f3f;

struct node

edge[maxm];

int tol;

int head[maxn];

int dep[maxn];

int gap[maxn];

void init()

void addedge(int u,int v,int w)

void bfs(int start,int end)

}}int sap(int start,int end,int n)//n為節點的個數 包括源點和匯點

for(i=0;idep[edge[i].to])

}--gap[dep[u]];

dep[u]=min+1;

++gap[dep[u]];

if(u!=start)u=edge[s[--top]].from;}}

return res;

}void floyd()}}

}}void getmap(int mid)}}

for(i=1;i<=k;i++)

for(i=k+1;i<=num;i++)

}int main()}}

floyd();

int l=0,r=inf;

int mid;

while(l<=r)

else

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

}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 ...

POJ 2112 二分 最大流

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

poj2112二分 最大流

跟上題一樣,因為一開始那份模板用的少,總懷疑那份sap模板出錯了,今天換了乙個模板做另外一題很像的題。先前的模板不能處理過大的數 事實證明我過程中處理錯了,好吧,先放著,校賽完在來找錯了。最後在錯誤在建圖的過程中,嚴格建圖過程,因為增加了牛與牛和機器與機器的距離,導致求最大流結果時出錯。includ...