题意:K个产奶机,C头奶牛,每个产奶机最多可供M头奶牛使用;并告诉了产奶机、奶牛之间的两两距离Dij(0<=i,j<K+C)。

问题:如何安排使得在任何一头奶牛都有自己产奶机的条件下,奶牛到产奶机的最远距离最短?最短是多少?

解题思路:首先用Floyd把两两之间的最小距离算出来,接下来二分枚举最短距离limit,只要i,j两点之间距离小于limit,连一条容量为1的边,源点到产奶机的边为M,限制了每个产奶机最多供M头奶牛。奶牛到汇点的边为1,表示每头牛都有一个产奶机。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;const int maxn = 250;
const int inf = 0x3f3f3f3f;
struct Edge
{int to,next,flow;
}edge[maxn*maxn];
int n,m,c,dis[maxn][maxn];
int head[maxn],cnt;
int level[maxn],st,ed;void addedge(int u,int v,int flow)
{edge[cnt].to = v;edge[cnt].flow = flow;edge[cnt].next = head[u];head[u] = cnt++;swap(u,v);edge[cnt].to = v;edge[cnt].flow = 0;edge[cnt].next = head[u];head[u] = cnt++;
}void floyd()
{for(int k = 1; k <= n + m; k++)for(int i = 1; i <= n + m; i++)for(int j = 1; j <= n + m; j++)dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
}void build(int limit)
{cnt = 0;memset(head,-1,sizeof(head));for(int i = 1; i <= n; i++)addedge(st,i,c);for(int i = n + 1; i <= n + m; i++)addedge(i,ed,1);for(int i = 1; i <= n; i++)for(int j = n + 1; j <= n + m; j++)if(dis[i][j] <= limit)addedge(i,j,1);
}int BFS(int src,int des){queue<int> q;memset(level,0,sizeof(level));level[src] = 1;q.push(src);while(!q.empty()){int u = q.front();q.pop();if(u==des) return 1;for(int k = head[u];k!=-1;k=edge[k].next){int v = edge[k].to,w = edge[k].flow;if(level[v] == 0 && w != 0){level[v]=level[u]+1;q.push(v);}}}return -1;
}int dfs(int u,int des,int increaseRoad){if(u == des) return increaseRoad;int ret = 0;for(int k=head[u];k!=-1;k=edge[k].next){int v = edge[k].to, w = edge[k].flow;if(level[v]==level[u]+1&&w!=0){int MIN = min(increaseRoad-ret,w);w = dfs(v,des,MIN);if(w > 0){edge[k].flow -=w;edge[k^1].flow +=w;ret += w;if(ret == increaseRoad) return ret;}else level[v] = -1; }}return ret;
}int Dinic(int src,int des){int ans = 0;while(BFS(src,des)!=-1) ans += dfs(src,des,inf);return ans;
}int main()
{while(scanf("%d%d%d",&n,&m,&c)!=EOF){st = 0, ed = n + m + 1;for(int i = 1; i <= n + m; i++)for(int j = 1; j <= n + m; j++){scanf("%d",&dis[i][j]);if(dis[i][j] == 0)dis[i][j] = inf;}floyd();int l = 1,r = inf,mid,ans;while(l <= r){mid = (l + r) >> 1;build(mid);int tmp = Dinic(st,ed);if(tmp == m){ans = mid;r = mid - 1;}else l = mid + 1;}printf("%d\n",ans);}return 0;
}

poj 2112 Optimal Milking(二分+Floyd+最大流)相关推荐

  1. POJ - 2112 Optimal Milking(二分+二分图最大匹配-多重匹配(修改匈牙利实现)+Floyd求最短路)

    题目链接:点击查看 题目大意:给出n个牛奶机器,再给出m只奶牛,每个机器只能让最多k只牛一起挤奶,现在问如何分配奶牛,能让最远的那只奶牛到达机器的距离最小 题目分析:很综合的一道题目了,不算很难,但比 ...

  2. POJ 2112 Optimal Milking(二分+最大流)

    POJ 2112 Optimal Milking 题目链接 题意:给定一些机器和奶牛,在给定距离矩阵,(不在对角线上为0的值代表不可达),每一个机器能容纳m个奶牛.问全部奶牛都能挤上奶,那么走的距离最 ...

  3. POJ 2112 Optimal Milking(二分图匹配)

    [题目链接] http://poj.org/problem?id=2112 [题目大意] 给出一些挤奶器,每台只能供给M头牛用,牛和挤奶器之间有一定的距离 现在要让每头牛都挤奶,同时最小化牛到挤奶器的 ...

  4. POJ-2112 Optimal Milking 二分+网络流

    题意: 有K个挤奶站,C头奶牛,每个挤奶站每天最多只能够为M头奶牛服务,奶牛到奶牛,奶牛到挤奶站都有一个距离,问一天能够为所有的奶牛都挤奶的匹配方案中,选择最远的距离最小方案. 解法: 通过二分枚举来 ...

  5. 二分于最大流之间的关系

    二分和最大流之间其实可以相互转换的,记得当时刚开始学二分的时候,做题经常发现一些数据不是很吊的二分总有人用最大流做,然后就研究一下,其实根本没什么可研究的只是当时自己太弱了,二分题的时候直接把流量限制 ...

  6. 【bzoj1532】[POI2005]Kos-Dicing 二分+网络流最大流

    题目描述 Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出玩得最好的人.现在有一个非常不走运的 ...

  7. bzoj 4094: [Usaco2013 Dec]Optimal Milking

    4094: [Usaco2013 Dec]Optimal Milking Description Farmer John最近购买了N(1 <= N <= 40000)台挤奶机,编号为1 . ...

  8. 【BZOJ4094】[Usaco2013 Dec]Optimal Milking 线段树

    [BZOJ4094][Usaco2013 Dec]Optimal Milking Description Farmer John最近购买了N(1 <= N <= 40000)台挤奶机,编号 ...

  9. [bzoj4094][Usaco2013 Dec]Optimal Milking 线段树

    4094: [Usaco2013 Dec]Optimal Milking Time Limit: 10 Sec  Memory Limit: 128 MB [Submit][Status][Discu ...

最新文章

  1. iOS动画系列之九:实现点赞的动画及播放起伏指示器
  2. 栖息地环境影响了鸿雁的肠道微生物
  3. python3 字符串大小写转换
  4. 2012年生活方向盘
  5. Iterable 超级接口
  6. linux系统监控、诊断工具摘录top IO wait lsof
  7. CreateWaitableTimer和SetWaitableTimer
  8. 404 Note Found 队-Alpha9
  9. 揭开牙病之谜 与牙医说再见转
  10. 开源流媒体SRS结合硬件视频实时转码服务器的部署
  11. 基于SSM框架的学生学籍管理系统(源码及具体讲解)
  12. 《人月神话(The Mythical Man-Month)》看清问题的本质:如果我们想解决问题,就必须试图先去理解它...
  13. 为什么你应聘不上或试用期被开?
  14. mathematica求定积分和不定积分
  15. 啪啪啪!敲代码时你喜欢听什么音乐?
  16. 匹兹堡大学约翰斯敦计算机学院,美国匹兹堡大学解析:研究生申请
  17. Android后台服务Service
  18. 汉语到了最危机时刻?
  19. 陌陌引流卖什么产品好?陌陌引流变现的方式
  20. 天刀一醉轩服务器维护多久,天涯明月刀手游服务器名字有哪些

热门文章

  1. 神策数据通过中国信通院 SDK 安全评测
  2. Auto-Scaling Web Applications in Clouds: A Taxonomy and Survey读书笔记
  3. Python3 django2.0 字段加密 解密 AES
  4. nodejs链接kafka示例(producer、consumer)
  5. nginx配置支持http2
  6. MyBatis知多少(22)MyBatis删除操作
  7. WinAPI: GetWindow - 获取与指定窗口具有指定关系的窗口的句柄
  8. how long does it take for 10km by bike?
  9. 让陌生人迅速相爱的36个问题
  10. systematic approach for educational resource gathering