Hdu 4280 最大流<模板>.cpp
题意:
给了一个T 代表有 T 组数据
每组数据给出 n 个点和 m 条边
然后接下来 n 行..x, y 表示每个点的坐标
然后 m 行..a b w 表示 a 点和 b 点之间有权值 w..
求最大流..
思路:
主要是最大流的方法..
最大流ISAP,邻接表+GAP+当前弧优化
Tips:
理解用法..
Code:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 #define clr(x) memset(x, 0xff, sizeof(x)) 6 #define min(a,b)(a)<(b)?(a):(b) 7 8 const int INF = 0x1f1f1f1f; 9 const int maxn = 100010; 10 const int maxm = 200010; 11 struct Edge 12 { 13 int from; 14 int to; 15 int next; 16 int w; 17 }edge[maxm]; 18 int tot; 19 int head[maxn]; 20 21 void add(int s, int u, int w) 22 { 23 edge[tot].from = s; 24 edge[tot].to = u; 25 edge[tot].w = w; 26 edge[tot].next = head[s]; 27 head[s] = tot++; 28 edge[tot].from = u; 29 edge[tot].to = s; 30 edge[tot].w = w; 31 edge[tot].next = head[u]; 32 head[u] = tot++; 33 } 34 35 int q[maxn]; 36 int cnt[maxn]; 37 int d[maxn]; 38 int low[maxn]; 39 int cur[maxn]; 40 41 int maxflow(int s, int t, int n) 42 { 43 int *front = q, *rear = q; 44 for(int i = 1; i <= n; ++i) { 45 d[i] = n; 46 cnt[i] = 0; 47 } 48 cnt[n] = n-1; 49 cnt[0]++; 50 d[t] = 0; 51 *rear++ = t; 52 while(front < rear) { 53 int v = *front++; 54 for(int i = head[v]; i != -1; i = edge[i].next) { 55 if(d[edge[i].to] == n && edge[i^1].w > 0) { 56 d[edge[i].to] = d[v] + 1; 57 cnt[n]--; 58 cnt[d[edge[i].to]]++; 59 *rear++ = edge[i].to; 60 } 61 } 62 } 63 64 int flow = 0, u = s, top = 0; 65 low[0] = INF; 66 for(int i = 1; i <= n; ++i) { 67 cur[i] = head[i]; 68 } 69 while(d[s] < n) { 70 int &i = cur[u]; 71 for(; i != -1; i = edge[i].next) { 72 if(edge[i].w > 0 && d[u] == d[edge[i].to]+1) { 73 low[top+1] = min(low[top], edge[i].w); 74 q[++top] = i; 75 u = edge[i].to; 76 break; 77 } 78 } 79 if(i != -1) { 80 if(u == t) { 81 int minf = low[top]; 82 for(int p = 1, i; p <= top; ++p) { 83 i = q[p]; 84 edge[i].w -= minf; 85 edge[i^1].w += minf; 86 } 87 flow += minf; 88 u = s; 89 low[0] = INF; 90 top = 0; 91 } 92 } 93 else { 94 int old_du = d[u]; 95 cnt[old_du]--; 96 d[u] = n-1; 97 for(int i = head[u]; i != -1; i = edge[i].next) 98 if(edge[i].w > 0 && d[u] > d[edge[i].to]) { 99 d[u] = d[edge[i].to]; 100 } 101 cnt[++d[u]]++; 102 if(d[u]<n) 103 cur[u] = head[u]; 104 if(u != s) { 105 u = edge[q[top]].from; 106 --top; 107 } 108 if(cnt[old_du] == 0) break; 109 } 110 } 111 return flow; 112 } 113 114 struct Node 115 { 116 int x; 117 int y; 118 }node[100010]; 119 120 int main() 121 { 122 int i, j, k; 123 int T, n, m; 124 int a, b, c; 125 int start, end; 126 while(scanf("%d", &T) != EOF) 127 while(T--) 128 { 129 start = end = 1; 130 tot = 0; 131 clr(head); 132 133 scanf("%d %d", &n, &m); 134 for(i = 1; i <= n; ++i) { 135 scanf("%d %d", &node[i].x, &node[i].y); 136 if(node[i].x > node[end].x) { 137 end = i; 138 } 139 if(node[i].x < node[start].x) { 140 start = i; 141 } 142 } 143 144 while(m--) { 145 scanf("%d %d %d", &a, &b, &c); 146 add(a, b, c); 147 } 148 149 int ans = maxflow(start, end, n); 150 printf("%d\n", ans); 151 } 152 return 0; 153 }