题目大意是:

    K台挤奶机器,C头牛,K不超过30,C不超过200,每台挤奶机器最多可以为M台牛工作,给出这些牛和机器之间,牛和牛之间,机器与机器之间的距离,在保证让最多的牛都有机器挤奶的情况下,给出其中距离最长的一头牛移动距离的最小值。

  首先用Floyd求出任意两点之间的最短距离,然后再用二分法限定最多的移动距离d,在求最大流时,搜索增广路的时候同时也判断距离有没有超过d就行了。

 #include <cstdio>
#include <cstring>
#include <queue>
#define _clr(x, y) memset(x, y, sizeof(x))
#define Min(x, y) (x < y ? x : y)
#define INF 0x3f3f3f3f
#define N 1005
using namespace std; int flow[N][N], dist[N][N];
int level[N];
int K, C, M, S, T, ln; void Floyd()
{
for(int k=; k<=ln; k++)
for(int i=;i<=ln; i++) if(dist[i][k]<INF)
for(int j=; j<=ln; j++)
if(dist[i][k]+dist[k][j]<dist[i][j])
dist[i][j] = dist[i][k]+dist[k][j];
} bool bfs()
{
_clr(level, -);
level[S] = ;
queue<int> Q;
Q.push(S);
while(!Q.empty())
{
int u = Q.front();
Q.pop();
for(int i=; i<=T; i++)
{
if(flow[u][i] && level[i]<)
{
level[i] = level[u] + ;
Q.push(i);
}
}
}
return level[T]> ? : ;
} int dfs(int x, int f)
{
int a;
if(x==T) return f;
for(int i=; i<=T; i++)
{
if(flow[x][i] && level[i]==level[x]+ && (a=dfs(i,Min(f,flow[x][i]))))
{
flow[x][i] -= a;
flow[i][x] += a;
return a;
}
}
level[x] = -;
return ;
} __int64 Dinic(int len)
{
// 构建残余网络
_clr(flow, );
for(int i=; i<=K; i++)
flow[S][i] = M;
for(int i=K+; i<=ln; i++)
flow[i][T] = ;
for(int i=; i<=K; i++) // 机器
for(int j=K+; j<=ln; j++) // 奶牛
flow[i][j] = (dist[i][j]<=len); // 求解最大流
__int64 ans=, a=;
while(bfs())
while(a=dfs(,INF)) ans += a;
return ans;
} // 二分求解满足条件的最小解
int Slove()
{
int l=, r=;
while(l<=r)
{
int mid = (l+r)>>;
if(Dinic(mid)>=C) r = mid-;
else l = mid+;
}
return l;
}
int main()
{
while(~scanf("%d%d%d", &K, &C, &M))
{
ln = K+C;
T = ln + ;
_clr(dist, );
for(int i=; i<=ln; i++)
for(int j=; j<=ln; j++)
{
scanf("%d", dist[i]+j);
if(dist[i][j]==) dist[i][j]=INF;
}
//// 求出个实体之间的各个最短距离
Floyd(); printf("%d\n", Slove());
}
return ;
}

poj 2112 floyd+Dinic最大流+二分最小值的更多相关文章

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

    题目链接 测试dinic模版,不知道这个模版到底对不对,那个题用这份dinic就是过不了.加上优化就WA,不加优化TLE. #include <cstdio> #include <s ...

  2. TTTTTTTTTTTT POJ 2112 奶牛与机器 多重二分匹配 跑最大流 建图很经典!!

    Optimal Milking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 15682   Accepted: 5597 ...

  3. POJ 2112 Optimal Milking 最短路 二分构图 网络流

    题意:有C头奶牛,K个挤奶站,每个挤奶器最多服务M头奶牛,奶牛和奶牛.奶牛和挤奶站.挤奶站和挤奶站之间都存在一定的距离.现在问满足所有的奶牛都能够被挤奶器服务到的情况下,行走距离的最远的奶牛的至少要走 ...

  4. POJ 2112 Optimal Milking【网络流+二分+最短路】

    求使所有牛都可以被挤牛奶的条件下牛走的最长距离. Floyd求出两两节点之间的最短路,然后二分距离. 构图: 将每一个milking machine与源点连接,边权为最大值m,每个cow与汇点连接,边 ...

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

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

  6. poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分, dinic, isap

    poj 2391 Ombrophobic Bovines, 最大流, 拆点, 二分 dinic /* * Author: yew1eb * Created Time: 2014年10月31日 星期五 ...

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

    题目大意: 在一个农场里面,有k个挤奶机,编号分别是 1..k,有c头奶牛,编号分别是k+1 .. k+c,每个挤奶机一天最让可以挤m头奶牛的奶,奶牛和挤奶机之间用邻接矩阵给出距离.求让所有奶牛都挤到 ...

  8. POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】

    Optimal Milking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Sub ...

  9. POJ--2112--Optimal Milking【Floyd+Dinic+二分答案】

    链接:http://poj.org/problem?id=2112 题意:有k个挤奶器.编号1~k,c头牛,编号k+1~k+c,每一个挤奶器最多能给m头牛挤奶,给你一个k+c的邻接矩阵.要求每头牛都能 ...

随机推荐

  1. Angularjs 日期格式转换

    我自己的随笔,记录我编码的点滴. <!DOCTYPE HTML><html><head>    <meta charset="utf-8" ...

  2. 数据结构与算法javascript描述

    <数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...

  3. Android 设置让EditText不自动获取焦点

    在EditText所在的父控件中设置如下属性: android:focusable="true" android:focusableInTouchMode="true&q ...

  4. 低效的SQL引发的cache buffers chains latch

    1.低效的SQL 低效的SQL语句时发生cache buffers chains 锁存器争用的最重要原因.多个进程同时扫描大范围的索引或表时,可能广泛 地发生cache buffers chains ...

  5. 《Algorithms 4th Edition》读书笔记——3.1 符号表(Elementary Symbol Tables)-Ⅱ

    3.1.2 有序的符号表 典型的应用程序中,键都是Comparable的对象,因此可以使用a.compare(b)来比较a和b两个键.许多符号表的实现都利用Comparable接口带来的键的有序性来更 ...

  6. SharePoint excel service web part 连接到 filter web part

    本文讲述SharePoint excel service web part 连接到 filter web part的一个简单应用场景. SharePoint excel service web par ...

  7. MySQL的备份和还原

    MySQL的备份和还原 备份:副本    RAID1,RAID10:保证硬件损坏而不会业务中止:        DROP TABLE mydb.tb1; 备份类型:        热备份.温备份和冷备 ...

  8. pyqt QTableWidget例子学习(重点)

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import * from PyQ ...

  9. c++之 数组

    数组的定义 数组用于表示一组数值,例如: char arr[5]; 其中,arr称为"数组变量",简称"数组".它表示5个char型数据,我们把每一个数据称为一 ...

  10. Rotate It !!(思维)

    Rotate It !! Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...