floyd + 最大流 (奶牛分配问题)
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
* 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
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 + 最大流 (奶牛分配问题)的更多相关文章
- POJ-2112 Optimal Milking(floyd+最大流+二分)
题目大意: 有k个挤奶器,在牧场里有c头奶牛,每个挤奶器可以满足m个奶牛,奶牛和挤奶器都可以看成是实体,现在给出两个实体之间的距离,如果没有路径相连,则为0,现在问你在所有方案里面,这c头奶牛需要走的 ...
- [ZOJ2760]How Many Shortest Path(floyd+最大流)
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1760 题意:给你一个一个n*n(n<=100)的有向图,问你从s到 ...
- BZOJ 2324: [ZJOI2011]营救皮卡丘( floyd + 费用流 )
昨晚写的题...补发一下题解... 把1~N每个点拆成xi, yi 2个. 预处理i->j经过编号不超过max(i,j)的最短路(floyd) S->0(K, 0), S->xi(1 ...
- POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)
<题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...
- poj 2391 (Floyd+最大流+二分)
题意:有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 两个避雨点间可以相互到 ...
- POJ1336 The K-League[最大流 公平分配问题]
The K-League Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 715 Accepted: 251 Descri ...
- bzoj 2324 [ZJOI2011]营救皮卡丘(floyd,费用流)
2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1777 Solved: 712[Submit][Stat ...
- zoj 2760 How Many Shortest Path 最大流
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1760 Given a weighted directed graph ...
- 【ACM】那些年,我们挖(WA)过的最短路
不定时更新博客,该博客仅仅是一篇关于最短路的题集,题目顺序随机. 算法思想什么的,我就随便说(复)说(制)咯: Dijkstra算法:以起始点为中心向外层层扩展,直到扩展到终点为止.有贪心的意思. 大 ...
随机推荐
- js 页面分享
首先说分享到QQ空间的通用代码:<a href="javascript:void(0);" onclick="window.open('http://sns.qzo ...
- 浅谈集合框架二 List、Set常用方法
最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...
- Vue 设置class样式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- redis常用指令总结以及功能介绍
第一部分 redis的常用指令 一.针对key的操作 1.1 del key [key .. ] , 删除指定的一个或者多个key;1.2 dump key ...
- 2018-8-10-win10-uwp-商业游戏-1.2.1
title author date CreateTime categories win10 uwp 商业游戏 1.2.1 lindexi 2018-08-10 19:16:50 +0800 2018- ...
- JRoll 2 适用于移动开发滚动(滑动)——轻量级插件
JRoll,一款能滚起上万条数据,具有滑动加速.回弹.缩放.滚动条.滑动事件等功能,兼容CommonJS/AMD/CMD模块规范,开源,免费的轻量级html5滚动插件. 官网:http://www.c ...
- java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity
今天想把ssh整合的代码跑起来,控制台就一直在报错,搞了半天!!! Hibernate: select computer0_.computerId as computer1_0_, computer0 ...
- 2019-6-23-win10-uwp-应用放到桌面
title author date CreateTime categories win10 uwp 应用放到桌面 lindexi 2019-06-23 11:11:30 +0800 2019-06-2 ...
- 【12.78%】【codeforces 677D】Vanya and Treasure
time limit per test1.5 seconds memory limit per test256 megabytes inputstandard input outputstandard ...
- CachedRowSet 接口
Sun Microsystems 提供的 CachedRowSet 接口的参考实现是一个标准实现.开发人员可以按原样使用此实现.可以扩展它,也可以选择自己编写此接口的实现. CachedRowSet ...