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. JQuery小结

    一.选择网页元素 jQuery的基本设计和主要用法,就是"选择某个网页元素,然后对其进行某种操作".这是它区别于其他函数库的根本特点. 使用jQuery的第一步,往往就是将一个选择 ...

  2. JAVA双向链表

    1.链表是一种重要的数据结构,在程序设计中占有很重要的地位 2.我们可以用类List来实现链表结构,用变量Head.Tail.Length.Pointer来实现表头.存储当前结点的指针时有一定的技 巧 ...

  3. mysql字符乱码

    解决mysql字符乱码思路: mysql服务器字符集 mysql客户端字符集 系统字符集 生产环境改字符集: 1.导出表结构到 scam.sql文件中 2.更改scam.sql文件中的字符集为想要的字 ...

  4. 细说jQuery原型的创建和实现原理,并用实例简单模仿

    在解析jQuery实现机理之前,我们先总结一下几点知识,这些都是我学习路上遇到的坑,我跌倒过很多次,现在把它补上: 1)自定义构造函数,如下例: function person(){ this.nam ...

  5. JS开发HTML5游戏《神奇的六边形》(二)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  6. Spring.Net 配置文件

    方法一. 直接在程序配置文件中配置 <configuration> <configSections> <sectionGroup name="spring&qu ...

  7. 注入语句详解(get注入,cookie注入,搜索型注入等)

    注意:对于普通的get注入,如果是字符型,前加'   后加 and ''=' 拆半法 ###################################### and exists (select ...

  8. 面试之servlet、过滤器、监听器

    servlet.过滤器.监听器servlet是Java中WEB请求和响应的容器servlet的运行需要在类似tomcat容器中,一个 Web 应用对应一个 Context 容器,也就是 Servlet ...

  9. javascript模拟jQuery封装委托事件,兼容IE

    var $ = function(id){ var dom = document.getElementById(id); return { on:function(eventType,element, ...

  10. 20145337实验四Android开发基础

    20145337实验四Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理器的使用: 掌握Android中事件处 ...