题目链接:

https://vjudge.net/problem/POJ-2112

题目大意:

k个机器,每个机器最多服务m头牛。

c头牛,每个牛需要1台机器来服务。

告诉你牛与机器每个之间的直接距离。

问:让所有的牛都被服务的情况下,使走的最远的牛的距离最短,求这个距离。

解题思路:

二分枚举距离,实际距离满足当前枚举距离限制的可以加入这条边。枚举的距离中符合条件的最小值就是答案。

建图过程:

一个超级汇点,每个机器和汇点的容量都是m。

一个超级源点,和每头牛的容量都是1.

机器i与牛j之间的距离如果小于等于当前枚举值mid,连接i,j,容量1.

这样最大流的意义就是能够服务的牛最多是多少,如果最大流等于牛的总数c,表示当前枚举值mid符合条件,同时说明mid值还可能可以更小,更新二分右边界r = mid .(最终答案也是r不是mid)

如果小于牛的总数,说明mid偏小,更新二分左边界,l = mid + 1.

机器与牛之间的最短距离可以用floyd预处理出来。

 #include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = + ;
const int INF = 0x3f3f3f3f;
struct edge
{
int u, v, c, f;
edge(int u, int v, int c, int f):u(u), v(v), c(c), f(f){}
};
vector<edge>e;
vector<int>G[maxn];
int a[maxn], p[maxn];
void init(int n)
{
e.clear();
for(int i = ; i <= n; i++)G[i].clear();
}
void addedge(int u, int v, int c)
{
//cout<<u<<" "<<v<<" "<<c<<endl;
e.push_back(edge(u, v, c, ));
e.push_back(edge(v, u, , ));
int m = e.size();
G[u].push_back(m - );
G[v].push_back(m - );
}
int Maxflow(int s, int t)
{
int flow = ;
for(;;)
{
memset(a, , sizeof(a));
queue<int>q;
q.push(s);
a[s] =INF;
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = ; i < G[u].size(); i++)
{
edge& now = e[G[u][i]];
int v = now.v;
if(!a[v] && now.c > now.f)//还未流经并且边还有容量
{
p[v] = G[u][i];
a[v] = min(a[u], now.c - now.f);
q.push(v);
}
}
if(a[t])break;//已经到达汇点
}
if(!a[t])break;//已经没有增广路
for(int u = t; u != s; u = e[p[u]].u)
{
e[p[u]].f += a[t];
e[p[u] ^ ].f -= a[t];
}
flow += a[t];
}
return flow;
}
int k, c, m, n;
int s, t;
int Map[maxn][maxn];
void build_map(int Maxdist_min)
{
init(n);//每次构建容量网络清空边
//超级源点s和所有牛建边,权值为1
for(int i = k + ; i <= n; i++)addedge(s, i, );
//所有挤奶机和超级汇点建边,权值为m(也就是一台挤奶机可供牛的最大数目)
for(int i = ; i <= k; i++)addedge(i, t, m);
for(int i = k + ; i <= n; i++)//牛的编号,后c个
{
for(int j = ; j <= k; j++)//挤奶机编号,前k个
{
if(Map[i][j] <= Maxdist_min)//小于最大距离,那么可以直达
addedge(i, j, );//牛和挤奶机可以配对
}
}
}
int main()
{
cin >> k >> c >> m;
n = k + c;
for(int i = ; i <= n; i++)//前k个点为挤奶机,后c个点为牛
{
for(int j = ; j <= n; j++)
{
cin >> Map[i][j];
if(Map[i][j] == )Map[i][j] = INF;
}
}
//Floyd求最短路
for(int k = ; k <= n; k++)
{
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
{
Map[i][j] = min(Map[i][j], Map[i][k] + Map[k][j]);
}
}
}
int l = , r = , mid;//此处最大距离不能是200,题目说的200只是一条边,可能要走很多条边
s = , t = n + ;
while(l < r)
{
mid = (l + r) / ;
//cout<<mid<<endl;
build_map(mid);
if(Maxflow(s, t) >= c)//说明所有的牛已经到达,最大距离可以更小
r = mid;
else l = mid + ;
}
cout<<r<<endl;//最大距离最小,这里的最大距离是r不是mid,因为最后一次循环的时候可能只更新mid和l,没有更新r
}

POJ2112 Optimal Milking---二分+Floyd+网络流的更多相关文章

  1. [USACO2003][poj2112]Optimal Milking(floyd+二分+二分图多重匹配)

    http://poj.org/problem?id=2112 题意: 有K个挤奶器,C头奶牛,每个挤奶器最多能给M头奶牛挤奶. 每个挤奶器和奶牛之间都有一定距离. 求使C头奶牛头奶牛需要走的路程的最大 ...

  2. POJ2112 Optimal Milking —— 二分图多重匹配/最大流 + 二分

    题目链接:https://vjudge.net/problem/POJ-2112 Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K T ...

  3. POJ 2112 Optimal Milking (二分 + floyd + 网络流)

    POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C ...

  4. POJ2112 Optimal Milking 【最大流+二分】

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12482   Accepted: 4508 ...

  5. POJ2112 Optimal Milking (网络流)(Dinic)

                                             Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K T ...

  6. POJ2112 Optimal Milking

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 17811   Accepted: 6368 ...

  7. POJ-2112 Optimal Milking(floyd+最大流+二分)

    题目大意: 有k个挤奶器,在牧场里有c头奶牛,每个挤奶器可以满足m个奶牛,奶牛和挤奶器都可以看成是实体,现在给出两个实体之间的距离,如果没有路径相连,则为0,现在问你在所有方案里面,这c头奶牛需要走的 ...

  8. POJ 2112 Optimal Milking(Floyd+多重匹配+二分枚举)

    题意:有K台挤奶机,C头奶牛,每个挤奶机每天只能为M头奶牛服务,下面给的K+C的矩阵,是形容相互之间的距离,求出来走最远的那头奶牛要走多远   输入数据: 第一行三个数 K, C, M  接下来是   ...

  9. poj2112 Optimal Milking --- 最大流量,二分法

    nx一个挤奶器,ny奶牛,每个挤奶罐为最m奶牛使用. 现在给nx+ny在矩阵之间的距离.要求使所有奶牛挤奶到挤奶正在旅程,最小的个体奶牛步行距离的最大值. 始感觉这个类似二分图匹配,不同之处在于挤奶器 ...

随机推荐

  1. 浏览器Quirksmode(怪异模式)与标准模式

    由于历史的原因,各个浏览器在对页面的渲染上存在差异,甚至同一浏览器在不同版本中,对页面的渲染也不同.在W3C标准出台以前,浏览器在对页面的渲染上没有统一规范,产生了差异(Quirks mode或者称为 ...

  2. Maven中常用插件的配置

    在Maven项目的pom.xml文件中配置插件信息,使用<build></build>标签 1.配置JDK版本插件和Tomcat版本插件 <build> <! ...

  3. Unity---UNet学习(1)----基本方法介绍

    目录 1.Network Manager 2.Network Manager HUD 3.Network Identity 4.Network Transform 5.特性 1.Network Man ...

  4. linux中使用wget模拟爬虫抓取网页

    如何在linux上或者是mac上简单使用爬虫或者是网页下载工具呢,常规的我们肯定是要去下载一个软件下来使用啦,可怜的这两个系统总是找不到相应的工具,这时wget出来帮助你啦!!!wget本身是拿来下载 ...

  5. Window安装配置Redis

    一.下载windows版本的Redis github下载地址:https://github.com/MSOpenTech/redis/tags 二.安装启动Redis Redis 支持 32 位和 6 ...

  6. Git Reference

    Installing and upgrading Git https://confluence.atlassian.com/bitbucketserver056/installing-and-upgr ...

  7. 根据从redis缓存的数据查询出来,在从数据库中取出所有的数据,俩个数据进行比较,去掉重复,剩下库中新插入的数据,取出新数据,然后把redis中的缓存数据清空把从数据库中查出来的所有数据放到redis缓存中

    参考代码: public String getNewCenter(HttpServletRequest request,HttpServletResponse resonse){ JSONObject ...

  8. 3、python数据类型之字符串(str)

    字符串是任何计算机语言中最常见的数据类型,python中也不例外,因此熟练掌握字符串是学习python的必备技能.python中字符串三种定义方式 str = 'wang' str = "w ...

  9. Cannot add or update a child row:

    两个 表 数据 不一致... 含有 约束 的 表 中 所有 id 都应该 在 主 表 中 可以 找到---

  10. C#基础之基本类型

    本丝花了近半年,终于将<CLR Via C#>这本书看完了(请不要BS本人的看书速度T_T),这确实是一本好书,大大们推荐的果然值得一读. 虽然很多东西还没有尽得其要,我常想在自己深刻掌握 ...