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)); }
}

最新文章

  1. java中Arraylist复制方法
  2. MVC中自带的异步((Ajax.BeginForm)无效
  3. SPSS数据分析—最小一乘法
  4. Visual Studio Code 1.0.1 for python
  5. JS列
  6. CCF认证之——相反数
  7. java重写和重载
  8. 读《Deep Learning Tutorial》(台湾大学 李宏毅 深度学习教学ppt)后杂记
  9. 你不知道的JavaScript --- 作用域相关
  10. salesforce零基础学习(九十三)Email To Case的简单实现
  11. 解决ASP.NET MVC(post数据)Json请求太大,无法反序列化,而报【远程服务器返回错误: (500) 内部服务器错误】
  12. [luogu4268][bzoj5195][USACO18FEB]Directory Traversal
  13. 搭建Linux下Android程序开发环境
  14. YII2中查询生成器Query()的使用
  15. Window下同一台服务器部署多个tomcat服务简易教程
  16. OpenCV图像的轮廓的匹配
  17. java的list集合如何根据对象中的某个字段排序?
  18. Thymeleaf模板如何获取springMVC返回的model值
  19. 学习笔记1126 - Fib的计算方法,降低了时间复杂度
  20. DataReader方式 获取数据

热门文章

  1. LabVIEW设计模式系列——资源关闭后错误处理
  2. iOS 9 关键字的简单使用
  3. 文件MD5查看器工具与源码实现及下载
  4. 解锁Scott过程中出现的问题及解决办法
  5. 【转】Angular Input格式化
  6. PHP 数组转字符串,与字符串转数组
  7. js setInterval和clearInterval 的使用
  8. 3D Game Programming with directx 11 习题答案 8.2
  9. PHP设计模式之:工厂模式
  10. ES的安装运行