题目大意:

有 k台挤奶机 和 c头奶牛

每台挤奶机最多为m头奶牛服务

给定所有挤奶机和奶牛两两之间的距离

求一种分配 使得 奶牛与挤奶机之间的最远距离 最小化

floyd求得所有挤奶机与奶牛两两之间的最短距离

二分一个最远距离M 建图

超级源点s与所有奶牛连容量为1的边

所有挤奶机与超级汇点t连容量为m的边

奶牛与挤奶机之间距离<=M的连容量为1的边

跑s到t的最大流 若最大流为c 说明这个最远距离M是符合要求的

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
const int N=;
int d[N][N],L,R;
int n,m,s,t; /**Dinic*/
struct NODE { int v,w,r; };
vector <NODE> E[N];
void addE(int u,int v,int w) {
E[u].push_back({v,w,E[v].size()});
E[v].push_back({u,,E[u].size()-});
}
int lev[N], cur[N];
bool bfs(int s,int t) {
mem(lev,); lev[s]=;
queue <int> q; q.push(s);
while(!q.empty()) {
int u=q.front(); q.pop();
for(int i=;i<E[u].size();i++) {
NODE e=E[u][i];
if(e.w> && !lev[e.v]) {
lev[e.v]=lev[u]+;
q.push(e.v);
}
}
}
return lev[t]>;
}
int dfs(int s,int t,int f) {
if(s==t) return f;
for(int& i=cur[s];i<E[s].size();i++) {
NODE& e=E[s][i];
if(e.w> && lev[s]<lev[e.v]) {
int d=dfs(e.v,t,min(f,e.w));
if(d>) {
e.w-=d; E[e.v][e.r].w+=d;
return d;
}
}
}
return ;
}
int maxFlow(int s,int t) {
int flow=, f;
while(bfs(s,t)) {
mem(cur,);
while((f=dfs(s,t,INF))>) flow+=f;
}
return flow;
}
/***/ bool check(int k,int c,int m,int M) {
for(int i=;i<=n+;i++) E[i].clear();
s=,t=n+;
for(int i=k+;i<=n;i++) addE(s,i,);
for(int i=;i<=k;i++) addE(i,t,m);
for(int i=k+;i<=n;i++)
for(int j=;j<=k;j++)
if(d[i][j]<=M) addE(i,j,);
return maxFlow(s,t)==c;
} void floyd(int k,int c) {
L=INF, R=-INF;
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) {
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
L=min(L,d[i][j]); R=max(R,d[i][j]);
}
} int main()
{
int k,c,m;
while(~scanf("%d%d%d",&k,&c,&m)) {
n=k+c;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) {
scanf("%d",&d[i][j]);
if(i!=j && !d[i][j])
d[i][j]=INF;
}
floyd(k,c);
int ans=;
while(L<=R) {
int M=(L+R)>>;
if(check(k,c,m,M))
ans=M,R=M-;
else L=M+;
}
printf("%d\n",ans);
} return ;
}

POJ 2112 /// 最大流+floyd+二分的更多相关文章

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

    [题意]有K台挤奶机,C头奶牛,在奶牛和机器间有一组长度不同的路,每台机器每天最多能为M头奶牛挤奶.现在要寻找一个方案,安排每头奶牛到某台机器挤奶,使得C头奶牛中走过的路径长度的和的最大值最小. 挺好 ...

  2. POJ 2112 Optimal Milking (二分+最短路径+网络流)

    POJ  2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K To ...

  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. POJ 2391 Ombrophobic Bovines ( 经典最大流 && Floyd && 二分 && 拆点建图)

    题意 : 给出一些牛棚,每个牛棚都原本都有一些牛但是每个牛棚可以容纳的牛都是有限的,现在给出一些路与路的花费和牛棚拥有的牛和可以容纳牛的数量,要求最短能在多少时间内使得每头牛都有安身的牛棚.( 这里注 ...

  5. POJ 2112 Optimal Milking ( 经典最大流 && Floyd && 二分 )

    题意 : 有 K 台挤奶机器,每台机器可以接受 M 头牛进行挤奶作业,总共有 C 头奶牛,机器编号为 1~K,奶牛编号为 K+1 ~ K+C ,然后给出奶牛和机器之间的距离矩阵,要求求出使得每头牛都能 ...

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

    http://poj.org/problem?id=2112 题意: 现在有K台挤奶器和C头奶牛,奶牛和挤奶器之间有距离,每台挤奶器每天最多为M头奶挤奶,现在要安排路程,使得C头奶牛所走的路程中的最大 ...

  7. POJ 2391 Ombrophobic Bovines ★(Floyd+二分+拆点+最大流)

    [题意]有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 和POJ2112很类 ...

  8. POJ - 2112 Optimal Milking (dijkstra + 二分 + 最大流Dinic)

    (点击此处查看原题) 题目分析 题意:在一个农场中有k台挤奶器和c只奶牛,每个挤奶器最多只能为m只奶牛挤奶,每个挤奶器和奶牛都视为一个点,将编号1~k记为挤奶器的位置,编号k+1~k+c记为奶牛的位置 ...

  9. poj 2391 Ombrophobic Bovines(最大流+floyd+二分)

    Ombrophobic Bovines Time Limit: 1000MSMemory Limit: 65536K Total Submissions: 14519Accepted: 3170 De ...

随机推荐

  1. UI库colorui的使用————小程序

    UI库colorui的使用----小程序 把colorui文件放到你的小程序中 包含文件: icon.wxss+main.wxss+components(文件夹里有icon和一些组件)+animati ...

  2. TensorFlow学习——入门篇

    本文主要通过一个简单的 Demo 介绍 TensorFlow 初级 API 的使用方法,因为自己也是初学者,因此本文的目的主要是引导刚接触 TensorFlow 或者 机器学习的同学,能够从第一步开始 ...

  3. linux 性能测试之基准测试工具

    https://niyunjiu.iteye.com/blog/316302 system: lmbench unixbench5.1.2 ubench freebench nbench ltp xf ...

  4. linux下的软链接与硬链接

    在 Linux 底下的连结档有两种,一种是类似 Windows 的快捷方式功能的文件,可以让你快速的链接到目标文件(或目录);这种链接称为软链接. 另一种则是透过文件系统的 inode 连结来产生新档 ...

  5. mongdb 简介以及安装

    1.什么是MongoDB?  MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨在为WEB应用提供 ...

  6. Mysq修改引擎

    [数据库]Mysql更改默认引擎为Innodb的步骤方法   前言 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定. 基本的差别为:MyI ...

  7. 存储过程如何传变量到like下

    存储过程中执行如下DDL语句create or replace procedure etl_test(v_com varchar2) is v_spname varchar2(40); com var ...

  8. Python格式输出汇总

    print ('%10s'%('test')) print ('{:<10}'.format('test'))#left-aligned print ('{:>10}'.format('t ...

  9. 用JSP实现WEB页面登录验证

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  10. 报数问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

    n = int(input("请输入人数:")) list_p = list(range(1,n+1)) #将所有人放在一个数字里面 count = 0 #设置一个变量,用户计算报 ...