题目大意:K个挤奶机,C头牛,每个挤奶机最多可以接待M头牛,各个K,C之间可能有道路连接,要让每个牛都找到挤奶机,求最小的走的路程最远的牛所需走的距离。

思路:首先看到要最小化最大值,所以需要二分。可以先用Floyd算法预处理出个点之间最短距离。之后来进行二分的判断,对于每个牛都要匹配到一个挤奶机,而每个挤奶机可以匹配多头牛,所以可以用二分图匹配,建立源汇点S,T,S与每个牛连一条cap为1的边,而每台挤奶机要与T连一条cap为M的边。对于每个要判断的距离,如果牛-挤奶机之间的距离小于此,就连一条边,否则不连边。之后求最大流即可,如果正好等于C,也就是所有牛都完成匹配,说明判断的这个距离可行。

代码:

//POJ.2112
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) typedef long long ll;
#define INF 0x3f3f3f3f
const int maxv = 1010; int V;
int D[maxv][maxv]; int K, C, M; struct edge {
int to, cap, rev;
}; vector<edge> G[maxv];
int level[maxv];
int iter[maxv]; void add_edge(int from, int to, int cap)
{
G[from].push_back(edge{ to, cap, (int)G[to].size() });
G[to].push_back(edge{ from, 0, (int)G[from].size() - 1 });
} void bfs(int s)
{
memset(level, -1, sizeof(level));
queue<int> que;
level[s] = 0;
que.push(s);
while (!que.empty())
{
int v = que.front();
que.pop();
for (int i = 0; i < G[v].size(); i++)
{
edge& e = G[v][i];
if (e.cap > 0 && level[e.to] < 0)
{
level[e.to] = level[v] + 1;
que.push(e.to);
}
}
}
} int dfs(int v, int t, int f)//找增广路
{
if (v == t)
return f;
for (int& i = iter[v]; i < G[v].size(); i++)
{
edge& e = G[v][i];
if (e.cap > 0 && level[v] < level[e.to])
{
int d = dfs(e.to, t, min(f, e.cap));
if (d > 0)
{
e.cap -= d;
G[e.to][e.rev].cap += d;
return d;
}
}
} return 0;
} int max_flow(int s, int t)
{
int flow = 0;
for (;;)
{
bfs(s);
if (level[t] < 0)
return flow;
memset(iter, 0, sizeof(iter));
int f;
while ((f = dfs(s, t, 0x3f3f3f3f3f3f3f3f)) > 0)
flow += f;
}
} bool E(int f)//看最多仅需f距离是否可行
{
//S=V,T=V+1
for (int i = 0; i < V + 2; i++)//最大流建图
G[i].clear();
for (int i = 0; i < K; i++)//挤奶-T连边
add_edge(i, V + 1, M);
for (int i = K; i < V; i++)//S-牛连边
add_edge(V, i, 1);
for (int i = 0; i < K; i++)//牛-挤奶之间,如果最短路小于f,连边容量1,否则不连边(只看《=f的边)
{
for (int j = K; j < V; j++)
{
if (D[j][i] <= f)
add_edge(j, i, 1);
}
}
return max_flow(V, V + 1) == C;
} void FloydWarshell()
{ for (int k = 0; k < V; k++)
{
for (int i = 0; i < V; i++)
{
for (int j = 0; j < V; j++)
D[i][j] = min(D[i][j], D[i][k] + D[k][j]);
}
}
} void solve()
{
FloydWarshell();
int lo = 0, hi = 1000 * V;
while (hi - lo > 1)
{
int mi = (lo + hi) / 2;
if (E(mi))
hi = mi;
else
lo = mi;
}
printf("%d\n", hi);
} int main()
{
scanf("%d%d%d", &K, &C, &M);
V = K + C;
for (int i = 0; i < V; i++)
{
for (int j = 0; j < V; j++)
{
int d;
scanf("%d", &d);
D[i][j] = d ? d : INF;
}
}
solve(); return 0;
}

POJ2112题解的更多相关文章

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

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

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. python 爬虫爬取历年双色球开奖信息

    目前写的这些爬虫都是些静态网页,对于一些高级网页(像经过JS渲染过的页面),目前技术并不能解决,自己也是在慢慢学习过程中,如有错误,欢迎指正: 对面前端知识本人并不懂,过程中如果涉及到前端知识,也是百 ...

  2. vue 快速入门 系列 —— Vue 实例的初始化过程

    其他章节请看: vue 快速入门 系列 Vue 实例的初始化过程 书接上文,每次调用 new Vue() 都会执行 Vue.prototype._init() 方法.倘若你看过 jQuery 的源码, ...

  3. Vulnhub靶机系列之Acid

    Acid 下载地址: ​ https://download.vulnhub.com/acid/Acid.rar ​ https://download.vulnhub.com/acid/Acid.rar ...

  4. 关于spring MVC 绑定json字符串与实体类绑定

    1 如果前台传json字符串,后台用@RequestBody 接收 前端 "content-Type":"application/json", 2  前台用fo ...

  5. Redis学习笔记(三)redis 的键管理

    Redis 的键管理 一.Redis 数据库管理 Redis 是一个键值对(key-value pair)的数据库服务器,其数据保存在 src/server.h/redisDb 中(网上很多帖子说在 ...

  6. C语言中缀表达式求值(综合)

    题前需要了解的:中缀.后缀表达式是什么?(不知道你们知不知道,反正我当时不知道,搜的百度) 基本思路:先把输入的中缀表达式→后缀表达式→进行计算得出结果 栈:"先进先出,先进后出" ...

  7. Android 关于Intent的一些简略总结

    感谢大佬:https://www.jianshu.com/p/19147a69e970 Intent 常用构造方法: | 方法 | 描述 | |Intent() | 构造一个空 Intent | | ...

  8. 入门-k8s部署应用 (三)

    Kubernetes 部署应用 在 k8s 上进行部署前,首先需要了解一个基本概念 Deployment Deployment 译名为 部署.在k8s中,通过发布 Deployment,可以创建应用程 ...

  9. @property增强

    1.@property增强 自从Xcode 4.x后,@property可以同时生成setter和getter的声明和实现 @interface Person : NSObject { int _ag ...

  10. 计算机网络模型与5G协议

    计算机网络模型与5G协议 目录 计算机网络模型与5G协议 一.分层思想 1.什么是分层思想 2.分层思想的优势 二.osi七层参考模型 1.国际标准化组织(ios) 2.七层模型及对应功能和硬件 3. ...