FJ has moved his K (1 <= K <= 30) milking machines out into the cow pastures among the C (1 <= C <= 200) cows. A set of paths of various lengths runs among the cows and the milking machines. The milking machine locations are named by ID numbers 1..K; the cow locations are named by ID numbers K+1..K+C.

Each milking point can "process" at most M (1 <= M <= 15) cows each day.

Write a program to find an assignment for each cow to some
milking machine so that the distance the furthest-walking cow travels is
minimized (and, of course, the milking machines are not overutilized).
At least one legal assignment is possible for all input data sets. Cows
can traverse several paths on the way to their milking machine.

Input

* Line 1: A single line with three space-separated integers: K, C, and M.

* Lines 2.. ...: Each of these K+C lines of K+C
space-separated integers describes the distances between pairs of
various entities. The input forms a symmetric matrix. Line 2 tells the
distances from milking machine 1 to each of the other entities; line 3
tells the distances from machine 2 to each of the other entities, and so
on. Distances of entities directly connected by a path are positive
integers no larger than 200. Entities not directly connected by a path
have a distance of 0. The distance from an entity to itself (i.e., all
numbers on the diagonal) is also given as 0. To keep the input lines of
reasonable length, when K+C > 15, a row is broken into successive
lines of 15 numbers and a potentially shorter line to finish up a row.
Each new row begins on its own line.

Output

A single line with a single integer that is the minimum possible total distance for the furthest walking cow.

Sample Input

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

Sample Output

2

题意 : 有 k 台机器, c 头奶牛, 每台机器最多可供喂养的奶牛的数量 m , 开始给出任意两点之间的距离,你可以随意的安置奶牛,要求奶牛走的最远的距离最小
思路分析 :
  首先可以用 floyd 跑出任意两点的最短路
  然后就是一个网络流即可,用源点和每个机器建立一条边,流量为 m , 用汇点和每头牛建立一条边,流量为 1,并且二分答案,当机器和牛的距离小于 mid 时,即可连边,每次更新答案即可
代码示例 :
const int maxn = 1e4+5;
const int inf = 0x3f3f3f3f; int k, c, m;
struct node
{
int to, next;
int flow;
}e[maxn<<1];
int head[maxn];
int cnt;
int mp[300][300]; void addedge(int u, int v, int w){
e[cnt].to = v, e[cnt].flow = w, e[cnt].next = head[u], head[u] = cnt++;
e[cnt].to = u, e[cnt].flow = 0, e[cnt].next = head[v], head[v] = cnt++;
} void flod() {
int sum = k+c;
for(int f = 1; f <= sum; f++){
for(int i = 1; i <= sum; i++){
for(int j = 1; j <= sum; j++){
mp[i][j] = min(mp[i][f]+mp[f][j], mp[i][j]);
}
}
}
} int dep[maxn], que[maxn];
bool bfs(int s, int t){
memset(dep, 0, sizeof(dep));
int head1 = 0, tail = 1; dep[s] = 1;
que[0] = s;
while(head1 < tail) {
int u = que[head1++];
for(int i = head[u]; i != -1; i = e[i].next) {
int to = e[i].to;
if (e[i].flow && !dep[to]) {
dep[to] = dep[u]+1;
que[tail++] = to;
}
}
}
return dep[t];
}
int aim;
int dfs(int u, int f1){
if (u == aim || f1 == 0) return f1; int f = 0;
for(int i = head[u]; i != -1; i = e[i].next){
int to = e[i].to;
if (e[i].flow && dep[to] == dep[u]+1){
int x = dfs(to, min(f1, e[i].flow));
e[i].flow -= x; e[i^1].flow += x;
f1 -= x, f += x;
if (f1 == 0) return f;
}
}
if (!f) dep[u] = -2;
return f;
} bool check(int lenth){
int s = 0, t = k+c+1;
memset(head, -1, sizeof(head));
cnt = 0; aim = t; for(int i = 1; i <= k; i++) addedge(s, i, m);
for(int i = k+1; i <= k+c; i++) addedge(i, t, 1);
for(int i = 1; i <= k; i++){
for(int j = k+1; j <= k+c; j++){
if (mp[i][j] <= lenth) addedge(i, j, 1);
}
}
int res = 0;
while(bfs(s, t)){
res += dfs(s, inf);
}
if (res == c) return true;
return false;
} int main() {
int x; cin >> k >> c >> m;
memset(mp, inf, sizeof(mp));
for(int i = 1; i <= k+c; i++){
for(int j = 1; j <= k+c; j++){
scanf("%d", &x);
if (x != 0) mp[i][j] = x;
}
}
flod();
int l = 0, r = 1e5;
int ans;
while(l <= r){
int mid = (l+r)>>1;
if (check(mid)) {ans = mid; r = mid-1;}
else l = mid+1;
}
cout <<ans << endl;
return 0;
}

floyd + 最大流 (奶牛分配问题)的更多相关文章

  1. POJ-2112 Optimal Milking(floyd+最大流+二分)

    题目大意: 有k个挤奶器,在牧场里有c头奶牛,每个挤奶器可以满足m个奶牛,奶牛和挤奶器都可以看成是实体,现在给出两个实体之间的距离,如果没有路径相连,则为0,现在问你在所有方案里面,这c头奶牛需要走的 ...

  2. [ZOJ2760]How Many Shortest Path(floyd+最大流)

    题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1760 题意:给你一个一个n*n(n<=100)的有向图,问你从s到 ...

  3. BZOJ 2324: [ZJOI2011]营救皮卡丘( floyd + 费用流 )

    昨晚写的题...补发一下题解... 把1~N每个点拆成xi, yi 2个. 预处理i->j经过编号不超过max(i,j)的最短路(floyd) S->0(K, 0), S->xi(1 ...

  4. POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)

    <题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...

  5. poj 2391 (Floyd+最大流+二分)

    题意:有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 两个避雨点间可以相互到 ...

  6. POJ1336 The K-League[最大流 公平分配问题]

    The K-League Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 715   Accepted: 251 Descri ...

  7. bzoj 2324 [ZJOI2011]营救皮卡丘(floyd,费用流)

    2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1777  Solved: 712[Submit][Stat ...

  8. zoj 2760 How Many Shortest Path 最大流

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1760 Given a weighted directed graph ...

  9. 【ACM】那些年,我们挖(WA)过的最短路

    不定时更新博客,该博客仅仅是一篇关于最短路的题集,题目顺序随机. 算法思想什么的,我就随便说(复)说(制)咯: Dijkstra算法:以起始点为中心向外层层扩展,直到扩展到终点为止.有贪心的意思. 大 ...

随机推荐

  1. CCPC2018 桂林 D "Bits Reverse"

    传送门 题目描述 Now given two integers x and y, you can reverse every consecutive three bits ,,) means chan ...

  2. ASP.NET Core 开启后台任务

    本文告诉大家如何通过 Microsoft.Extensions.Hosting.BackgroundService 开启后台任务 实现 BackManagerService 类继承 Backgroun ...

  3. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  4. Codeforces Round #524 (Div. 2) codeforces 1080A~1080F

    目录 codeforces1080A codeforces 1080B codeforces 1080C codeforces 1080D codeforces 1080E codeforces 10 ...

  5. web应用中web.xml文件的解释

    一.web.xml配置文件常用元素及其意义预览 1 <web-app> 2 3 <!--定义了WEB应用的名字--> 4 <display-name></di ...

  6. Deep Learning ——Yann LeCun,Yoshua Bengio&Geoffrey Hinton

    引言: 深度学习的本质是用多层的神经网络找到一个可以被学习的复杂的函数实现语音识别,图像识别等功能. 多层神经网络的结构: 多层神经元的组成,每一层的输入都等于上一层的输出. 应用领域:cv,nlp ...

  7. 怎么彻底删除用友通T3财务软件?

    [问题现象]怎么彻底删除用友通T3财务软件? [原因分析]通过"添加或删除程序"无法正常卸载用友通T3,也尝试了360安全卫士强力卸载,都无法完全卸载,有没有办法可以彻底删除用友通 ...

  8. Java正则表达式学习与记录

    转载自:http://www.runoob.com/java/java-regular-expressions.html 正则表达式定义了字符串的模式,用于搜索.编辑或处理文本. 1.正则表达式中字符 ...

  9. 搜索排序-learning to Rank简介

    Learning to Rank pointwise \[ L\left(f ; x_{j}, y_{j}\right)=\left(y_{j}-f\left(x_{j}\right)\right)^ ...

  10. Docker Swarm Mode简介与核心概念

    什么是Docker Swarm Docker Swarm是Docker官方的一种容器编排方案,用于管理跨主机的Docker容器,可以快速对指定服务进行水平扩展.部署.删除 一个Docker Swarm ...