題目:
輸入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...