需要直接到达,因此源点经过三条边后必须要达到汇点,但为了保证网络流的正确性(路径可反悔),因此不可限制层次网络的最高层次为3,最好的方法既是让所有点拆分成两个点,一个点从汇点进入,一个点通向汇点,任意两点的路径则标注为最短路径。

//Dinic算法-拆点构图
//Time:625Ms Memory:2108K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
#define MAX 405
#define INF 0x3f3f3f3f
#define LL long long
int n, m;
int s, t;
int cow[MAX], hide[MAX];
LL d[MAX][MAX];
int res[MAX][MAX];
int lev[MAX];
void build_map(LL limit) //拆点构图
{
memset(res, 0, sizeof(res));
for (int i = 1; i <= n; i++)
{
res[s][i] = cow[i];
res[i + n][t] = hide[i];
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (d[i][j] <= limit) res[i][j + n] = INF;
}
bool bfs() //构建层次网络
{
memset(lev, -1, sizeof(lev));
queue<int> q;
q.push(s); lev[s] = 0;
while (!q.empty() && lev[t] == -1) {
int cur = q.front(); q.pop();
for (int i = 1; i <= t; i++)
{
if (lev[i] == -1 && res[cur][i])
{
lev[i] = lev[cur] + 1;
q.push(i);
}
}
}
return lev[t] != -1;
}
int dfs(int x, int sum) //增广并更新
{
if (x == t || sum == 0) return sum;
int src = sum;
for (int i = 1; i <= t; i++)
{
if (lev[i] == lev[x] + 1 && res[x][i])
{
int tmp = dfs(i, min(sum, res[x][i]));
res[x][i] -= tmp;
res[i][x] += tmp;
sum -= tmp;
}
}
return src - sum;
}
int Dinic()
{
int maxFlow = 0;
while (bfs())
maxFlow += dfs(0, INF);
return maxFlow;
}
int main()
{
//freopen("in.txt", "r", stdin);
memset(d, INF, sizeof(d));
scanf("%d%d", &n, &m);
s = 0; t = 2 * n + 1;
int cows = 0; //总牛数
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &cow[i], &hide[i]);
cows += cow[i];
}
for (int i = 1; i <= m; i++)
{
int u, v;
LL w;
scanf("%d%d%lld", &u, &v, &w);
d[u][v] = d[v][u] = min(w, d[u][v]);
}
//Floyd
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
{
d[0][i] = d[i][t] = 0;
if (d[i][k] != d[0][0]) {
for (int j = 1; j <= n; j++)
{
if (i != j) d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
else d[i][j] = 0;
}
}
}
LL l = 0, r = 200LL * 1000000000;
int last;
while (l < r)
{
LL mid = (l + r) / 2;
build_map(mid);
last = Dinic();
last == cows ? r = mid : l = mid + 1;
}
if (r != 200LL * 1000000000)
printf("%lld\n", r);
else printf("-1\n");
return 0;
}

ACM/ICPC 之 网络流-拆点构图(POJ2391)的更多相关文章

  1. ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)

    第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点 //第一道网络流 //Ford-Fulkerson //Time:47M ...

  2. ACM/ICPC 之 网络流入门-EK算法(参考模板)(POJ1273)

    基于残留网络与FF算法的改进-EK算法,核心是将一条边的单向残留容量的减少看做反向残留流量的增加. //网络流 //EK算法 //Time:16Ms Memory:348K #include<i ...

  3. HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  4. 【转】ACM/ICPC生涯总结暨退役宣言—alpc55

    转自:http://hi.baidu.com/accplaystation/item/ca4c2ec565fa0b7fced4f811 ACM/ICPC生涯总结暨退役宣言—alpc55 前言 早就该写 ...

  5. ACM - ICPC World Finals 2013 C Surely You Congest

    原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...

  6. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

  7. 2016 ACM ICPC Asia Region - Tehran

    2016 ACM ICPC Asia Region - Tehran A - Tax 题目描述:算税. solution 模拟. B - Key Maker 题目描述:给出\(n\)个序列,给定一个序 ...

  8. 2017 ACM ICPC Asia Regional - Daejeon

    2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...

  9. hdu 4289 网络流拆点,类似最小割(可做模板)邻接矩阵实现

    Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

随机推荐

  1. 小记:目标数组的长度不够。请检查 destIndex 和长度以及数组的下限。

    异常:System.ArgumentException: 目标数组的长度不够.请检查 destIndex 和长度以及数组的下限.(不好意思忘记截图了) 发生异常的代码如下: var list = ne ...

  2. Hibernate批量处理海量数据的方法

    本文实例讲述了Hibernate批量处理海量数据的方法.分享给大家供大家参考,具体如下: Hibernate批量处理海量其实从性能上考虑,它是很不可取的,浪费了很大的内存.从它的机制上讲,Hibern ...

  3. Oracle11g字符集AL32UTF8修改为ZHS16GBK详解【转】

    ------感谢作者,确实解决了问题.分享下,希望帮到更多人 此问题发生在数据库迁移过程中.源数据库:自己笔记本上win7 64位系统的oracle11g个人版,字符集ZHS16GBK :目标数据库, ...

  4. hdu3415 单调队列

    Max Sum of Max-K-sub-sequence Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  5. [转]数据恢复 文件恢复工具 DiskGenius v4.9.1 绿色专业版及单文件

    必备神软!数据恢复及磁盘分区利器DiskGenius,目前最新版为v4.9.1,现在又有新思路的已注册专业版,已亲测可成功恢复4G以上的大文件,但不能虚拟磁盘格式转换!想用新版功能的有福了,推荐使用! ...

  6. 【BZOJ-1123】BLO Tarjan 点双连通分量

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 970  Solved: 408[Submit][Status][ ...

  7. 放下恩怨,曝小米中兴投关键性一票让华为顺利取得5G短码控制权

    如果说最近国内科技公司最牛逼最令人振奋的新闻是啥,显然,就是两天前在3GPP RAN1 87次会议的5G短码方案讨论中,华为顺利碾压高通,战胜列强,拿下了5G的控制编码方案的标准. 虽然说,目前,华为 ...

  8. python的颜色显示

    我们知道在命令行下,python的输出的字符串颜色和一般字符相同. 若我们想强调某些字符,我们可以利用代码将要强调的部分变成某种颜色. 在linux终端命令可以显示某种颜色,在windows的cmd终 ...

  9. 谈谈java开发

    1.不要让未来的决策阻止你现在前进的方向 一步步列出每个步骤,那么对于现在应该专注于做什么,就一目了然了.你也不会浪费   时间去担心应该以后操心的事情. 2.不要让自信诱骗你忘事 当你去学习一个新概 ...

  10. G-FAQ – Why is Bit Depth Important?

    直接抄: https://apollomapping.com/2012/August/article15.html For this month’s Geospatial Frequently Ask ...