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模板题)的更多相关文章

  1. HDU 4280 Island Transport(网络流,最大流)

    HDU 4280 Island Transport(网络流,最大流) Description In the vast waters far far away, there are many islan ...

  2. HDU 4280 Island Transport

    Island Transport Time Limit: 10000ms Memory Limit: 65536KB This problem will be judged on HDU. Origi ...

  3. HDU 4280 Island Transport(dinic+当前弧优化)

    Island Transport Description In the vast waters far far away, there are many islands. People are liv ...

  4. Hdu 4280 Island Transport(最大流)

    Island Transport Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  5. HDU 4280 Island Transport(无向图最大流)

    HDU 4280:http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意: 比较裸的最大流题目,就是这是个无向图,并且比较卡时间. 思路: 是这样的,由于是 ...

  6. HDU 4280 Island Transport(网络流)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=4280">http://acm.hdu.edu.cn/showproblem.php ...

  7. HDU 4280 Island Transport(HLPP板子)题解

    题意: 求最大流 思路: \(1e5\)条边,偷了一个超长的\(HLPP\)板子.复杂度\(n^2 \sqrt{m}\).但通常在随机情况下并没有isap快. 板子: template<clas ...

  8. HDU 2222(AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...

  9. HDU 5521.Meeting 最短路模板题

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

随机推荐

  1. CentOS默认开放的本地端口范围

    系统本地开放端口的范围:(默认30000多到60000多) [root@linux2 ~]# vim /etc/sysctl.conf net.ipv4.ip_local_port_range = 1 ...

  2. js控制滚动条平滑滚动到制定位置

    http://www.daixiaorui.com/read/92.html 滚动到顶部: $('.scroll_top').click(function(){$('html,body').anima ...

  3. Linux_shell脚本_遍历文件夹下所有文件

    参考:lunar1983的专栏 实现:从给定目录树中grep出含制定字符串的行,并给出所在路径 代码如下所示: #!/bin/sh - if [ $# -ne 2 ] then echo " ...

  4. SQL异常:ORA-00936: missing expression

    select * from t_user where id in()当条件in的内容为空时抛 java.sql.SQLException: ORA-00936: missing expression ...

  5. centos6 LVS-DR模式---分析

    LVS是什么就不多说了. 先上拓扑图 1台LVS   3台Realserver    一个客户端.  环境全部模拟全在内网环境(selinux和iptables关闭) 先简略说一下安装步骤: LVS上 ...

  6. NLP 自然语言处理

    参考: 自然语言处理怎么最快入门:http://www.zhihu.com/question/ 自然语言处理简介:http://wenku.baidu.com/link?url=W6Mw1f-XN8s ...

  7. Linux启动过程

    系统BIOS是当你点击开机键是第一个运行的程序.1. 首先主板需要接收到一个稳定的电源供给信号.如果没有得到稳定的电源供给系统自动关闭.2. 当接受到一个稳定的电源供给信号,处理器会启动,当处理器启动 ...

  8. Android课程---帧布局 FrameLayout

    帧布局的特点是: 1.多个组件,层叠显示 2.所占位置和大小由组件决定 示例代码: <?xml version="1.0" encoding="utf-8" ...

  9. P1311 选择客栈

    开始写了一个O(n3)的算法,只得了60,后来思考(找题解),得到了一个O(nk)的算法 其实就是一种预处理的思想,对于每一个客栈而言,只要我们预处理出他前面可以匹配的客栈数量,就可以了. 所以我们记 ...

  10. 【转载】区间信息的维护与查询(一)——二叉索引树(Fenwick树、树状数组)

    在网上找到一篇非常不错的树状数组的博客,拿来转载,原文地址. 树状数组 最新看了一下区间的查询与修改的知识,最主要看到的是树状数组(BIT),以前感觉好高大上的东西,其实也不过就这么简单而已. 我们有 ...