Hdu 4280 最大流<模板>.cpp
2012-09-15 21:33
453 查看
[b]题意:[/b]
给了一个T 代表有 T 组数据
每组数据给出 n 个点和 m 条边
然后接下来 n 行..x, y 表示每个点的坐标
然后 m 行..a b w 表示 a 点和 b 点之间有权值 w..
求最大流..
[b]思路:[/b]
主要是最大流的方法..
最大流ISAP,邻接表+GAP+当前弧优化
[b]Tips:[/b]
理解用法..
[b]Code:[/b]
View Code
[b]题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4280[/b]
给了一个T 代表有 T 组数据
每组数据给出 n 个点和 m 条边
然后接下来 n 行..x, y 表示每个点的坐标
然后 m 行..a b w 表示 a 点和 b 点之间有权值 w..
求最大流..
[b]思路:[/b]
主要是最大流的方法..
最大流ISAP,邻接表+GAP+当前弧优化
[b]Tips:[/b]
理解用法..
[b]Code:[/b]
View Code
#include <stdio.h> #include <cstring> #include <iostream> using namespace std; #define clr(x) memset(x, 0xff, sizeof(x)) #define min(a,b)(a)<(b)?(a):(b) const int INF = 0x1f1f1f1f; const int maxn = 100010; const int maxm = 200010; struct Edge { int from; int to; int next; int w; }edge[maxm]; int tot; int head[maxn]; void add(int s, int u, int w) { edge[tot].from = s; edge[tot].to = u; edge[tot].w = w; edge[tot].next = head[s]; head[s] = tot++; edge[tot].from = u; edge[tot].to = s; edge[tot].w = w; edge[tot].next = head[u]; head[u] = tot++; } int q[maxn]; int cnt[maxn]; int d[maxn]; int low[maxn]; int cur[maxn]; int maxflow(int s, int t, int n) { int *front = q, *rear = q; for(int i = 1; i <= n; ++i) { d[i] = n; cnt[i] = 0; } cnt = n-1; cnt[0]++; d[t] = 0; *rear++ = t; while(front < rear) { int v = *front++; for(int i = head[v]; i != -1; i = edge[i].next) { if(d[edge[i].to] == n && edge[i^1].w > 0) { d[edge[i].to] = d[v] + 1; cnt --; cnt[d[edge[i].to]]++; *rear++ = edge[i].to; } } } int flow = 0, u = s, top = 0; low[0] = INF; for(int i = 1; i <= n; ++i) { cur[i] = head[i]; } while(d[s] < n) { int &i = cur[u]; for(; i != -1; i = edge[i].next) { if(edge[i].w > 0 && d[u] == d[edge[i].to]+1) { low[top+1] = min(low[top], edge[i].w); q[++top] = i; u = edge[i].to; break; } } if(i != -1) { if(u == t) { int minf = low[top]; for(int p = 1, i; p <= top; ++p) { i = q[p]; edge[i].w -= minf; edge[i^1].w += minf; } flow += minf; u = s; low[0] = INF; top = 0; } } else { int old_du = d[u]; cnt[old_du]--; d[u] = n-1; for(int i = head[u]; i != -1; i = edge[i].next) if(edge[i].w > 0 && d[u] > d[edge[i].to]) { d[u] = d[edge[i].to]; } cnt[++d[u]]++; if(d[u]<n) cur[u] = head[u]; if(u != s) { u = edge[q[top]].from; --top; } if(cnt[old_du] == 0) break; } } return flow; } struct Node { int x; int y; }node[100010]; int main() { int i, j, k; int T, n, m; int a, b, c; int start, end; while(scanf("%d", &T) != EOF) while(T--) { start = end = 1; tot = 0; clr(head); scanf("%d %d", &n, &m); for(i = 1; i <= n; ++i) { scanf("%d %d", &node[i].x, &node[i].y); if(node[i].x > node[end].x) { end = i; } if(node[i].x < node[start].x) { start = i; } } while(m--) { scanf("%d %d %d", &a, &b, &c); add(a, b, c); } int ans = maxflow(start, end, n); printf("%d\n", ans); } return 0; }
[b]题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4280[/b]
相关文章推荐
- HDU 4280 ISAP+BFS 最大流 模板
- HDU 2444 The Accomodation of Students(最大二分匹配(匈牙利算法)+二分图判断->模板题目)
- hdu 4289 Control(网络流 最大流+拆点)(模板)
- HDU1532 最大流-模板题
- HDU 1754 B I Hate It 线段树 单点更新 区间最大值 模板
- hdu 4280 Island Transport 最大流sap
- 【最大流之EdmondsKarp算法】【HDU1532】模板题
- HDU 1856 More is better(简单并查集) 【最大并查集人数模板】
- HDU 2795 放模板 (线段树_维护最大值,好题)
- 栈优化最大流-HDU-4280-Island Transport
- <模板>计算SG函数-(hdu 1848 Fibonacci again and again)
- HDU 1754 B I Hate It 线段树 单点更新 区间最大值 模板
- 【最大流之EdmondsKarp算法】【HDU1532】模板题
- hdu 3605 Escape 多重匹配模板 (Hungary ) | 最大流
- 【最大流+模板题】杭电 hdu 3549 Flow Problem
- HDU 4280 Island Transport(裸最大流)
- zoj3792 Romantic Value 最大流<->最小割
- HDU 4280 Island Transport 最大流SAP
- <模板>Hdu4869 Turn the pokers 组合数求余 费马小定理
- [HDU]2444 The Accomodation of Students二分图最大流匹配模板