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

你可能感兴趣的:(HDU)