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 ...
随机推荐
- 将普通工程转为mvn标准工程(main resources)
It is sometimes required to change the default source folder working on the java project. One best e ...
- 运维、linux运维是什么?
从不知道运维是什么 到后来接触了linux运维 后来玩遍了运维常用的各种开源软件发现原来运维是这么回事 又到了后来,运维真的是我理解的这些吗?会软件,会配置,会部署.会调优,会处理故障...但是总觉得 ...
- unity3d插件Daikon Forge GUI 中文教程2-基础控件Label的使用
我们先来设置 UI Root 中的如下:屏幕大小为1024*768 2.1 新建一个Label 控件 先来看看Control Properties (基本上是所有控件都共用的)的以后不再介绍,参数: ...
- jsTree 的简单用法--异步加载和刷新数据
首先这两个文件是必须要引用的,还有就是引用 jQuery 文件就不说了: <link href="/css/plugins/jsTree/style.min.css" rel ...
- 为Eclipse安装主题插件
方法2:通过站点更新 eclipse:Help->Install New Software->Work with:Update Site -http://eclipse-color-the ...
- 百度Site App的uaredirect.js实现手机访问,自动跳转网站手机版
以下为代码,可放置在网站foot底部文件,或者haead顶部文件,建议将代码放在网站顶部,这样可以实现手机访问立即跳转! <script src="http://siteapp.bai ...
- Bomb---hdu5934(连通图 缩点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5934 题意:有n个炸弹,每个炸弹放在(x, y)这个位置,它能炸的范围是以 r 为半径的圆,手动引爆这 ...
- 能套用的tab栏切换
效果: 在style.js文件里封装了一个Show函数,有4个参数,di(当前点击的按钮),num(按钮个数,也可以说是下面具体内容个数),divn(一个id前缀,这个例子里是ta,),active( ...
- vim - Simple commands to remove unwanted whitespace
http://vim.wikia.com/wiki/Remove_unwanted_spaces 1. manual commandremove trailing whitespace::%s/\s\ ...
- DuiLib学习笔记4——布局
有了前面三篇的基础,现在可以开始布局了. 首先任何布局都必须包含在<Window></Window>标签内,跟<html></html>很像. DuiL ...