HDU 4280:Island Transport(ISAP模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=4280
题意:在最西边的点走到最东边的点最大容量。
思路:ISAP模板题,Dinic过不了。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#include <set>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
typedef long long LL;
struct Edge {
int u, v;
LL cap;
Edge () {}
Edge (int u, int v, LL cap) : u(u), v(v), cap(cap) {}
}edge[N*];
vector<int> G[N];
int dis[N], cur[N], num[N], pre[N], tot, S, T; void Add(int u, int v, int cap) {
edge[tot] = Edge(u, v, cap);
G[u].push_back(tot++);
edge[tot] = Edge(v, u, cap);
G[v].push_back(tot++);
} int BFS() { // 逆向BFS
memset(dis, -, sizeof(dis));
queue<int> que; que.push(T);
dis[T] = ;
while(!que.empty()) {
int u = que.front(); que.pop();
for(int i = ; i < G[u].size(); i++) {
Edge &e = edge[G[u][i]];
if(dis[e.v] == -) {
dis[e.v] = dis[u] + ;
que.push(e.v);
}
}
}
return ~dis[S];
} int DFS() { // 通过pre数组回溯更新流量
int u = T; int flow = INF;
while(u != S) {
Edge &e = edge[pre[u]];
if(e.cap < flow) flow = e.cap;
u = e.u;
} u = T;
while(u != S) {
Edge& e1 = edge[pre[u]];
Edge& e2 = edge[pre[u]^];
e1.cap -= flow; e2.cap += flow;
u = e1.u;
}
return flow;
} int ISAP(int n) {
if(!BFS()) return ; // 从汇点到源点逆向BFS初始化dis数组
memset(num, , sizeof(num));
memset(cur, , sizeof(cur)); // 当前弧优化
for(int i = ; i <= n; i++)
if(~dis[i]) num[dis[i]]++; // 当前距离为dis[i]的结点数
int ans = , u = S;
while(dis[S] < n) {
if(u == T) ans += DFS(), u = S; // 回溯之前的结点并把更新流量
int flag = ;
for(int i = ; i < G[u].size(); i++) {
Edge &e = edge[G[u][i]];
if(dis[e.v] + == dis[u] && e.cap > ) { // 可以增广
pre[e.v] = G[u][i]; cur[u] = i;
flag = ; u = e.v;
break;
}
}
if(!flag) { // 不能增广,retreat
if(--num[dis[u]] == ) break; // gap优化
int md = n;
for(int i = ; i < G[u].size(); i++) {
Edge &e = edge[G[u][i]];
if(e.cap > && dis[e.v] < md) {
md = dis[e.v]; cur[u] = i;
}
}
num[dis[u] = md + ]++;
if(u != S) u = edge[pre[u]].u;
}
}
return ans;
} int main() {
int t;
scanf("%d", &t);
while(t--) {
int n, m;
scanf("%d%d", &n, &m);
tot = ; for(int i = ; i <= n; i++) G[i].clear();
int u, v, c, west = , east = -;
for(int i = ; i <= n; i++) {
scanf("%d%d", &u, &v);
if(west > u) west = u, S = i;
if(east < u) east = u, T = i;
}
for(int i = ; i <= m; i++) {
scanf("%d%d%d", &u, &v, &c);
Add(u, v, c); // 无向图的话反向边的cap也是c
}
printf("%d\n", ISAP(n));
}
return ;
}
HDU 4280:Island Transport(ISAP模板题)的更多相关文章
- HDU 4280 Island Transport(网络流,最大流)
HDU 4280 Island Transport(网络流,最大流) Description In the vast waters far far away, there are many islan ...
- HDU 4280 Island Transport
Island Transport Time Limit: 10000ms Memory Limit: 65536KB This problem will be judged on HDU. Origi ...
- HDU 4280 Island Transport(dinic+当前弧优化)
Island Transport Description In the vast waters far far away, there are many islands. People are liv ...
- Hdu 4280 Island Transport(最大流)
Island Transport Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- HDU 4280 Island Transport(无向图最大流)
HDU 4280:http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意: 比较裸的最大流题目,就是这是个无向图,并且比较卡时间. 思路: 是这样的,由于是 ...
- HDU 4280 Island Transport(网络流)
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=4280">http://acm.hdu.edu.cn/showproblem.php ...
- HDU 4280 Island Transport(HLPP板子)题解
题意: 求最大流 思路: \(1e5\)条边,偷了一个超长的\(HLPP\)板子.复杂度\(n^2 \sqrt{m}\).但通常在随机情况下并没有isap快. 板子: template<clas ...
- HDU 2222(AC自动机模板题)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...
- HDU 5521.Meeting 最短路模板题
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
随机推荐
- CentOS默认开放的本地端口范围
系统本地开放端口的范围:(默认30000多到60000多) [root@linux2 ~]# vim /etc/sysctl.conf net.ipv4.ip_local_port_range = 1 ...
- js控制滚动条平滑滚动到制定位置
http://www.daixiaorui.com/read/92.html 滚动到顶部: $('.scroll_top').click(function(){$('html,body').anima ...
- Linux_shell脚本_遍历文件夹下所有文件
参考:lunar1983的专栏 实现:从给定目录树中grep出含制定字符串的行,并给出所在路径 代码如下所示: #!/bin/sh - if [ $# -ne 2 ] then echo " ...
- SQL异常:ORA-00936: missing expression
select * from t_user where id in()当条件in的内容为空时抛 java.sql.SQLException: ORA-00936: missing expression ...
- centos6 LVS-DR模式---分析
LVS是什么就不多说了. 先上拓扑图 1台LVS 3台Realserver 一个客户端. 环境全部模拟全在内网环境(selinux和iptables关闭) 先简略说一下安装步骤: LVS上 ...
- NLP 自然语言处理
参考: 自然语言处理怎么最快入门:http://www.zhihu.com/question/ 自然语言处理简介:http://wenku.baidu.com/link?url=W6Mw1f-XN8s ...
- Linux启动过程
系统BIOS是当你点击开机键是第一个运行的程序.1. 首先主板需要接收到一个稳定的电源供给信号.如果没有得到稳定的电源供给系统自动关闭.2. 当接受到一个稳定的电源供给信号,处理器会启动,当处理器启动 ...
- Android课程---帧布局 FrameLayout
帧布局的特点是: 1.多个组件,层叠显示 2.所占位置和大小由组件决定 示例代码: <?xml version="1.0" encoding="utf-8" ...
- P1311 选择客栈
开始写了一个O(n3)的算法,只得了60,后来思考(找题解),得到了一个O(nk)的算法 其实就是一种预处理的思想,对于每一个客栈而言,只要我们预处理出他前面可以匹配的客栈数量,就可以了. 所以我们记 ...
- 【转载】区间信息的维护与查询(一)——二叉索引树(Fenwick树、树状数组)
在网上找到一篇非常不错的树状数组的博客,拿来转载,原文地址. 树状数组 最新看了一下区间的查询与修改的知识,最主要看到的是树状数组(BIT),以前感觉好高大上的东西,其实也不过就这么简单而已. 我们有 ...