Optimal Milking
poj2112:http://poj.org/problem?id=2112
题意:K台挤奶机器,C头牛,K不超过30,C不超过200,每台挤奶机器最多可以为M台牛工作,给出这些牛和机器之间,牛和牛之间,机器与机器之间的距离,在保证让最多的牛都有机器挤奶的情况下,给出其中最长的一头牛移动的距离的最小值。
题解:首先用Floyd求出任意两点之间的最短距离,然后再用二分法限定最多的移动距离d,在求最大流时,搜索增广路的时候同时也判断距离有没有超过d就行了。
#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int map[][];
const int INF=;
struct Node{
int c;
int f;
}ma[][];
int m,c,knum,pre[];
int sx,se;
void Floy(){
for(int k=;k<=knum+c;k++)
for(int i=;i<=c+knum;i++)
for(int j=;j<=c+knum;j++){
if(k!=i&&i!=j&&k!=j&&map[i][k]+map[k][j]<map[i][j])
map[i][j]=map[i][k]+map[k][j];
}
}
bool BFS(){
memset(pre,,sizeof(pre));
queue<int>Q;
Q.push(sx);
pre[sx]=;
while(!Q.empty()){
int d=Q.front();
Q.pop();
for(int i=;i<=knum+c+;i++){
if(!pre[i]&&ma[d][i].c-ma[d][i].f){
pre[i]=pre[d]+;
Q.push(i);
}
}
}
return pre[se]!=;
}
int dinic(int pos,int flow){
int f=flow;
if(pos==se)
return flow;
for(int i=;i<=c+knum+;i++){
if(ma[pos][i].c-ma[pos][i].f&&pre[i]==pre[pos]+){
int a=ma[pos][i].c-ma[pos][i].f;
int t=dinic(i,min(a,flow));
ma[pos][i].f+=t;
ma[i][pos].f-=t;
flow-=t;
if(flow<=)break;
}
}
if(f-flow<=)pre[pos]=-;
return f-flow;
}
int sum(){
int s=;
while(BFS())
s+=dinic(sx,INF);
return s;
}
void build(int maxn){
memset(ma,,sizeof(ma));
for(int i=knum+;i<=knum+c;i++)
ma[][i].c=;
for(int i=;i<=knum;i++)
ma[i][se].c=m;
for(int i=knum+;i<=c+knum;i++)
for(int j=;j<=knum;j++){
if(map[i][j]<=maxn)
ma[i][j].c=;
}
}
int dinic2(int maxn) {
int maxflow;
int low=,mid,up=maxn;
while(low<=up){
mid=(low+up)>>;
build(mid);
maxflow=;
maxflow=sum();
if(maxflow<c)low=mid+;
else
up=mid-;
}
return up+;
}
int main(){
int maxn;
while(~scanf("%d%d%d",&knum,&c,&m)){
sx=;se=knum+c+;
maxn=;
for(int i=;i<=knum+c;i++)
for(int j=;j<=knum+c;j++){
scanf("%d",&map[i][j]);
if(map[i][j]==)
map[i][j]=INF;
}
Floy();
for(int i=;i<=knum+c;i++)
for(int j=;j<=knum+c;j++)
if(map[i][j]<INF&&map[i][j]>maxn)
maxn=map[i][j]; printf("%d\n",dinic2(maxn)); }
}
Optimal Milking的更多相关文章
- Optimal Milking 分类: 图论 POJ 最短路 查找 2015-08-10 10:38 3人阅读 评论(0) 收藏
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 13968 Accepted: 5044 Case ...
- POJ2112 Optimal Milking (网络流)(Dinic)
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K T ...
- POJ 2112 Optimal Milking (二分+最短路径+网络流)
POJ 2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS Memory Limit: 30000K To ...
- poj Optimal Milking
Optimal Milking 题目: 有K个机器.C仅仅牛.要求求出最全部牛到各个产奶机的最短距离.给出一个C+K的矩阵,表示各种标号间的距离. 而每一个地方最多有M仅仅牛. 算法分析: 二分+最短 ...
- POJ 2112 Optimal Milking (二分 + floyd + 网络流)
POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C ...
- 题解 最优的挤奶方案(Optimal Milking)
最优的挤奶方案(Optimal Milking) 时间限制: 1 Sec 内存限制: 128 MB 题目描述 农场主 John 将他的 K(1≤K≤30)个挤奶器运到牧场,在那里有 C(1≤C≤20 ...
- POJ 2112 Optimal Milking (Dinic + Floyd + 二分)
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 19456 Accepted: 6947 ...
- POJ2112 Optimal Milking
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 17811 Accepted: 6368 ...
- Optimal Milking POJ - 2112 (多重最优匹配+最小费用最大流+最大值最小化 + Floyd)
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 19347 Accepted: 690 ...
- P3097 [USACO13DEC]最优挤奶Optimal Milking
P3097 [USACO13DEC]最优挤奶Optimal Milking 题意简述:给定n个点排成一排,每个点有一个点权,多次改变某个点的点权并将最大点独立集计入答案,输出最终的答案 感谢@zht4 ...
随机推荐
- tcpreplay安装使用
#Author: ypguo#Data: 2010.4.23#Version: 1.2 增加了修改VLAN tag内容. 1.1 修改了cygwin下安装的内容 ...
- 批处理,修改环境变量path的方法(加环境变量)
方法一:批处理中,修改环境变量,一次性有效(也就是在当前的脚本中有效) CMD中运行 set path==%path%;d:/mypath 用 set path可以查看,当前的环境变量 方法二 :批处 ...
- index页面数据展示为设定的命名
数据库表里面字段的值想用另一种命名形式展示,如1是 是,2是 否 解决方法: 用到formatter ,{field: 'params', title: '参数', width: 100, sort ...
- Spring AOP体系学习总结:
二.Spring AOP体系学习总结: 要理解AOP整体的逻辑需要理解一下Advice,Pointcut,Advisor的概念以及他们的关系. Advice是为Spring Bean提供增强逻辑的接口 ...
- css3 盒模型
0,前言 在css2.1 之前,我们都熟知的两种盒模型,一种是w3c标准盒模型,另外一种是怪异模式下的盒模型.在css3之前我们一直使用的是标准盒模型,但是标准盒模型的宽度总是需要小心的去使用,稍有不 ...
- jQuery 取值、赋值的基本方法【转藏】
/*获得TEXT.AREATEXT的值*/ var textval = $("#text_id").attr("value"); //或者 var textva ...
- chrome偶尔弹出新窗口的解决方案
最近使用谷歌浏览器,在搜索页点击搜索结果时,偶尔会弹出新窗口,而不是新标签,试验发现,只要将chrome里面安装的google drive app卸载就行了. 当然了,如果此方法不适合你的情况,还可以 ...
- python基础知识七
我们会使用raw_input和print语句来完成这些功能. 对于输出,也可以使用多种多样的str(字符串)类. 例如使用rjust方法来得到一个按一定宽度右对齐的字符串. 可以通过创建一个file类 ...
- Java 去除utf-8类型的空格的方法
问题产生 最近遇到一个这样的问题,在生成的报文中,某个字段信息后面有一个空格,在代码中trim()下,它仍然存在.到底什么原因呢? 问题的根源 经过多番查证,是由于utf-8中的特俗字符造成的. 问题 ...
- iOS-UI控件精讲之UIView
道虽迩,不行不至:事虽小,不为不成. 相关阅读 1.iOS-UI控件精讲之UIView(本文) 2.iOS-UI控件精讲之UILabel ...待续 UIView是所有UI控件的基类,在布局的时候通常 ...