Optimal Milking(POJ2112+二分+Dinic)
题目链接:http://poj.org/problem?id=2112
题目:


题意:有k台挤奶机,c头奶牛,每台挤奶机每天最多生产m的奶,给你每个物品到其他物品的距离(除了物品到自己本省的距离为0外,两者之间没有路线直接到达也为0,此时需要将距离处理为inf),问跑最远距离的奶牛要跑多远。
思路:先用floyd将各物品间的最短距离求出来,再二分跑最远距离的奶牛走的距离x,将小于x的两者之间进行连边,流量为1,引入一个超级源点和超级汇点,我们采用方向建图的方式,让超级源点与挤奶机连边,且流量为m,奶牛与超级汇点连边,流量为1,跑一边Dinic,如果最大流为c那么ub变成mid-1,否则lb为mid+1。
代码实现如下:
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;;
typedef pair<int, int> pii;
typedef unsigned long long ull; #define lson i<<1
#define rson i<<1|1
#define bug printf("*********\n");
#define FIN freopen("D://code//in.txt", "r", stdin);
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define IO ios::sync_with_stdio(false),cin.tie(0); const double eps = 1e-;
const int mod = ;
const int maxn = + ;
const double pi = acos(-);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f; int k, c, m, s, e, num, tot, maxflow;
int mp[maxn][maxn], head[maxn], d[maxn]; queue<int> q; struct edge {
int v, w, next;
}ed[maxn*maxn]; void addedge(int u, int v, int w) {
ed[tot].v = v;
ed[tot].w = w;
ed[tot].next = head[u];
head[u] = tot++;
ed[tot].v = u;
ed[tot].w = ;
ed[tot].next = head[v];
head[v] = tot++;
} bool bfs() {
memset(d, , sizeof(d));
while(!q.empty()) q.pop();
q.push(s);
d[s] = ;
while(!q.empty()) {
int x = q.front(); q.pop();
for(int i = head[x]; ~i; i = ed[i].next) {
int y = ed[i].v;
if(ed[i].w && !d[y]) {
q.push(y);
d[y] = d[x] + ;
if(y == e) return ;
}
}
}
return ;
} int dinic(int x, int flow) {
if(x == e) return flow;
int rest = flow, k;
for(int i = head[x]; ~i && rest; i = ed[i].next) {
int y = ed[i].v;
if(ed[i].w && d[y] == d[x] + ) {
k = dinic(y, min(rest, ed[i].w));
if(!k) d[y] = ;
ed[i].w -= k;
ed[i^].w += k;
rest -= k;
}
}
return flow - rest;
} bool check(int x) {
tot = ;
memset(head, -, sizeof(head));
for(int i = ; i <= k; i++) {
for(int j = k + ; j <= num; j++) {
if(mp[i][j] <= x) {
addedge(i, j, );
}
}
}
for(int i = ; i <= k; i++) {
addedge(s, i, m);
}
for(int i = k + ; i <= num; i++) {
addedge(i, e, );
}
int flow = ;
maxflow = ;
while(bfs()) {
while((flow = dinic(s, inf))) maxflow += flow;
}
return maxflow == c;
} int main() {
//FIN;
scanf("%d%d%d", &k, &c, &m);
num = k + c;
for(int i = ; i <= num; i++) {
for(int j = ; j <= num; j++) {
scanf("%d", &mp[i][j]);
if(i != j && mp[i][j] == ) {
mp[i][j] = inf;
}
}
}
for(int k = ; k <= num; k++) {
for(int i = ; i <= num; i++) {
for(int j = ; j <= num; j++) {
if(mp[i][j] > mp[i][k] + mp[k][j]) {
mp[i][j] = mp[i][k] + mp[k][j];
}
}
}
}
s = , e = num + ;
int ub = inf, lb = , mid;
while(ub >= lb) {
mid = (ub + lb) >> ;
if(check(mid)) ub = mid - ;
else lb = mid + ;
}
printf("%d\n", lb);
return ;
}
Optimal Milking(POJ2112+二分+Dinic)的更多相关文章
- POJ 2112 Optimal Milking (二分+最短路径+网络流)
POJ 2112 Optimal Milking (二分+最短路径+网络流) Optimal Milking Time Limit: 2000MS Memory Limit: 30000K To ...
- POJ 2112 Optimal Milking (二分 + floyd + 网络流)
POJ 2112 Optimal Milking 链接:http://poj.org/problem?id=2112 题意:农场主John 将他的K(1≤K≤30)个挤奶器运到牧场,在那里有C(1≤C ...
- POJ - 2112 Optimal Milking (dijkstra + 二分 + 最大流Dinic)
(点击此处查看原题) 题目分析 题意:在一个农场中有k台挤奶器和c只奶牛,每个挤奶器最多只能为m只奶牛挤奶,每个挤奶器和奶牛都视为一个点,将编号1~k记为挤奶器的位置,编号k+1~k+c记为奶牛的位置 ...
- POJ 2112 Optimal Milking (Floyd+二分+最大流)
[题意]有K台挤奶机,C头奶牛,在奶牛和机器间有一组长度不同的路,每台机器每天最多能为M头奶牛挤奶.现在要寻找一个方案,安排每头奶牛到某台机器挤奶,使得C头奶牛中走过的路径长度的和的最大值最小. 挺好 ...
- POJ 2112 Optimal Milking(二分+最大流)
http://poj.org/problem?id=2112 题意: 现在有K台挤奶器和C头奶牛,奶牛和挤奶器之间有距离,每台挤奶器每天最多为M头奶挤奶,现在要安排路程,使得C头奶牛所走的路程中的最大 ...
- POJ 2112: Optimal Milking【二分,网络流】
题目大意:K台挤奶机,C个奶牛,每台挤奶器可以供M头牛使用,给出奶牛和和机器间的距离矩阵,求所有奶牛走最大距离的最小值 思路:最大距离的最小值,明显提示二分,将最小距离二分之后问题转化成为:K台挤奶机 ...
- POJ 2112 Optimal Milking (Dinic + Floyd + 二分)
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 19456 Accepted: 6947 ...
- POJ2112 Optimal Milking —— 二分图多重匹配/最大流 + 二分
题目链接:https://vjudge.net/problem/POJ-2112 Optimal Milking Time Limit: 2000MS Memory Limit: 30000K T ...
- POJ2112 Optimal Milking 【最大流+二分】
Optimal Milking Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 12482 Accepted: 4508 ...
随机推荐
- Ubuntu16.0.4 安装mysql
1. sudo apt-get install mysql-server 2. sudo apt-get install mysql-client 3. sudo apt-get install l ...
- 转Web开发的发展史---Web开发技术的演变
转自:http://blog.csdn.net/zzzkk2009/article/details/9849431 在接下来的几个月时间里,我打算写一系列关于完整web开发的文章.这第一篇文章虽然有所 ...
- 2018年小米高级 PHP 工程师面试题(模拟考试卷)
1.通过哪一个函数,可以把错误转换为异常处理? A:set_error_handler B:error_reporting C:error2exception D:catch 正确答案:A 答案分析: ...
- 生活中的goto
if(你是个傻逼?){ out.println("继续你的傻逼生活吧!"); }else(你不是傻逼?){ out.println("你说不是都不是啊,继续你的傻逼生活吧 ...
- MyBatis的架构设计以及实例分析
MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个sel ...
- 【bzoj5108】[CodePlus2017]可做题 拆位+乱搞
题目描述 给出一个长度为 $m$ 的序列 $a$ ,编号为 $a_1\sim a_m$,其中 $n$ 个位置的数已经确定,剩下的位置的数可以任意指定.现在令 $b$ 表示 $a$ 的前缀异或和,求 $ ...
- Java入门之:基本数据类型
Java基本数据类型 变量就是申请内存来存储值,也就是说,当创建变量的时候,需要在内存中申请空间.内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来存储该类型的数据,如下图所示: 因此, ...
- 深入理解Delete(JavaScript)
深入理解Delete(JavaScript) Delete 众所周知是删除对象中的属性. 但如果不深入了解delete的真正使用在项目中会出现非常严重的问题 (: Following 是翻译 ka ...
- 【题解】51nod 1686第K大区间
成功的秘诀,在于克服自己看题解的冲动……[笑哭].自己A掉这题还是灰常开心的~ 以及爱死 two - pointer ! two - pointer 大法是真的好哇……这个题目有上一题的经验:求第\( ...
- [洛谷P4721]【模板】分治 FFT
题目大意:给定长度为$n-1$的数组$g_{[1,n)}$,求$f_{[0,n)}$,要求: $$f_i=\sum_{j=1}^if_{i-j}g_j\\f_0=1$$ 题解:直接求复杂度是$O(n^ ...