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 ...
随机推荐
- android开发之记录ListView滚动位置
这个问题本身不难,但是由于项目中的需求太过于复杂,结果导致这个问题变得不是那么容易实现.在网上一搜,结果如下: 我不知道是who copy who?反正介绍的所谓的三种方法,第一种都是无法运行的,很明 ...
- c# 值传递 引用传递
以前一直误以为引用类型,在作为参数传递时,都是引用传递(类似于值传递中的ref),也就是说,把引用类型的变量作为参数传递给方法,在方法中修改该参数,会改变这个变量的值, 后来通过一些事例发现,上面的认 ...
- ubuntu自定义服务模板
根据他人代码修改: #!/bin/sh ### BEGIN INIT INFO # Provides: <pragram name> # Required-Start: $local_fs ...
- day-7
/* 倒数7天了 某一天 某一刻 某次呼吸 我们终将再分离 而我的 自传里 曾经有你 没有遗憾的诗句 诗句里 充满感激 (小仙女博客抄来的233) 是啊 就快要结束了 曲终人散 上午被错误数据卡了一小 ...
- Jquery Call WebDav
最近研究了一下WebDav,尝试了一下用Jquery.ajax 发生请求访问WebDav. 代码如下: <!DOCTYPE html> <html xmlns="http: ...
- mysql锁表和解锁语句分享
对于MySQL来说,有三种锁的级别:页级.表级.行级 页级的典型代表引擎为BDB. 表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM. 行级的典型代表引擎为INNODB. ...
- .Net程序员学习Linux(二)
本次知识点:递归命令符,wc命令,文档编辑器 vi的简单使用,文本常用操作命令,find查询文件命令,grep匹配文本中对应的关键字 递归命令符 递归对于程序猿来说不默认,经常用于级联关系,一层套一层 ...
- sql server split函数
--创建分割函数CREATE FUNCTION dbo.Split(@String varchar(8000),@Delimiter char(1))returns @temptable TABLE ...
- Android eclipse - aapt.exe has stopped working.
今天在修改Android的布局文件的时候,发现每保存一次,就提示: aapt.exe has stopped working(appt.exe已停止工作).很是郁闷,当时Android控制台已经提示错 ...
- JS 定時刷新父類頁面
function timeCount() { var url = "MAC.aspx"; parent.location.href = url; } function beginC ...