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算法:以起始点为中心向外层层扩展,直到扩展到终点为止.有贪心的意思. 大 ...
随机推荐
- java io流与序列化反序列化
java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入 ...
- 使用原生JS封装一个动画函数
最近一直在忙项目,很少有时间回顾之前的知识,今天刚好要做一个轮播,因为对兼容性有一定的要求,使用了各种插件和库中的轮播,效果都不是很理想,一怒之下,使用原生JS封装了一个轮播组件,其中重要的功能就是一 ...
- C# 输出文件夹下的所有文件
问题:如何输出给定文件夹目录下面的所有文件的名称? C#代码: using System; using System.IO; namespace MyTest { public class Progr ...
- thinkPHP框架中执行原生SQL语句的方法
这篇文章主要介绍了thinkPHP框架中执行原生SQL语句的方法,结合实例形式分析了thinkPHP中执行原生SQL语句的相关操作技巧,并简单分析了query与execute方法的使用区别,需要的朋友 ...
- easyui—element-ui框架套用(表格宽度自适应)
外层使用easyui框架中window组件,便于使用最大化功能:内部表格使用element-ui在的el-table,el-table列宽须设置为最小宽度才能在最大化窗口时列表中列宽自适应window ...
- H3C生成树协议
- opacity兼容性以及存在问题处理
opacity兼容性以及存在问题处理 opacity兼容性 opacity属性是CSS3的属性,用于设置元素的不透明级别.语法: opacity: value | inherit; ①值value表示 ...
- Java方法参数:
一个方法不能修改一个基本数据类型的参数 一个方法可以改变一个对象参数的状态 一个方法不能实现让对象参数引用一个新的对象 案例1: 一个方法不能修改一个基本数据类型的参数 String a = &quo ...
- vue(axios)封装,content-type由application/json转换为application/x-www-form-urlencoded
现在主流的http请求头的content-type有三种(不讨论xml): application/x-www-form-urlencoded 最常见的提交数据方式,与原生form表单数据一致,在c ...
- 从0开始.NET CORE认证
引子 最近在学习IdentityServer4,看了园子里大神们的文章,但是看完之后,能明白这样做可以达到业务需求.但是为什么这样做可以达到业务需求,我用其他方式不行吗?为什么这样做可以呢.也就是老话 ...