Hdu 4280 最大流<模板>.cpp

题意:

给了一个T 代表有 T 组数据

每组数据给出 n 个点和 m 条边

然后接下来 n 行..x, y 表示每个点的坐标

然后 m 行..a b w 表示 a 点和 b 点之间有权值 w..

求最大流..

思路:

主要是最大流的方法..

最大流ISAP,邻接表+GAP+当前弧优化

Tips:

理解用法..

Code:

View Code
  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 }

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4280

原文地址:https://www.cnblogs.com/Griselda/p/2686981.html