HDU 4280Island Transport(Dinc非STL 模板)

题意: n岛m条路,然后是 n个岛的坐标,然后是m条双向路,包括 岛和 岛 之间 最大客流量,让求 最左边的岛 到右边的岛 最大客流量

分析: 建图 以 左边的岛为原点,最右边的为终点求最大客流量。

刘汝佳STL会超时,因为vector牵扯到 复制操作

然后看大神的将stl全换了 http://www.cnblogs.com/xiao-xin/articles/4452306.html

  1 #include <iostream>
  2 #include <cstring>
  3 #include <vector>
  4 #include <algorithm>
  5 #include <cstdio>
  6 #include <queue>
  7 using namespace std;
  8 const int INF = 0x3f3f3f3f;
  9 const int Max = 100000 + 10;
 10 struct Edge
 11 {
 12     int to, flow, Next;
 13 };
 14 struct Dinic
 15 {
 16     int n, s, t, now;
 17     Edge edges[Max * 2];
 18     bool vis[Max];
 19     int d[Max], head[Max], q[Max];
 20     void init(int _s, int _t, int _n)
 21     {
 22         s = _s; t = _t; n = _n;
 23         memset(head, -1, sizeof(head));
 24         now = 0;
 25     }
 26     void addEdge(int from, int to, int flow)
 27     {
 28         edges[now].to = to; edges[now].flow = flow;
 29         edges[now].Next = head[from]; head[from] = now++;
 30 
 31         edges[now].to = from; edges[now].flow = flow;
 32         edges[now].Next = head[to]; head[to] = now++;
 33     }
 34     bool BFS()
 35     {
 36         memset(vis, 0, sizeof(vis));
 37         int Front =0, rear = 0;
 38         q[rear++] = s;
 39         d[s] = 0;
 40         vis[s] = 1;
 41         while (Front < rear)
 42         {
 43             int x = q[Front++];
 44             for (int i = head[x]; i != -1; i = edges[i].Next)
 45             {
 46                 if ( vis[edges[i].to] == 0 && edges[i].flow > 0)
 47                 {
 48                     vis[edges[i].to] = 1;
 49                     d[ edges[i].to ] = d[x] + 1;
 50                     q[ rear++ ] = edges[i].to;
 51                 }
 52             }
 53         }
 54         return vis[t];
 55     }
 56     int DFS(int x, int a)
 57     {
 58         if (x == t || a == 0)
 59             return a;
 60         int flow = 0, f;
 61         for (int i = head[x]; i != -1; i = edges[i].Next)
 62         {
 63             if (d[x] + 1 == d[edges[i].to] && edges[i].flow > 0)
 64             {
 65                 f = DFS(edges[i].to, min(a - flow, edges[i].flow));
 66                 edges[i].flow -= f;
 67                 edges[i ^ 1].flow += f;
 68                 flow += f;
 69                 if (flow == a)
 70                     return flow;
 71             }
 72         }
 73         if (flow == 0)
 74             d[x] = 0;
 75         return flow;
 76     }
 77     int MaxFlow()
 78     {
 79         int flow = 0;
 80         while ( BFS() )
 81         {
 82             flow += DFS(s, INF);
 83         }
 84         return flow;
 85     }
 86 
 87 }g;
 88 /*
 89 struct Dinic
 90 {
 91     int n, s, t;
 92     vector<Edge> edges;
 93     vector<int> G[Max];
 94     bool vis[Max];
 95     int d[Max];
 96     int cur[Max];
 97     void init(int _n, int _s, int _t)
 98     {
 99         n = _n;
100         s = _s;
101         t = _t;
102         edges.clear();
103         for (int i = 0; i <= n; i++)
104             G[i].clear();
105     }
106     void addEdge(int from, int to, int cap)
107     {
108         Edge edge;
109         edge.from = from;
110         edge.to = to;
111         edge.cap = cap;
112         edge.flow = 0;
113         edges.push_back(edge);
114         edge.from = to;
115         edge.to = from;
116         edge.cap = cap;
117         edge.flow = 0;
118         edges.push_back(edge);
119         int m = (int) edges.size();
120         G[from].push_back(m - 2);
121         G[to].push_back(m - 1);
122     }
123     bool BFS()
124     {
125         memset(vis, 0, sizeof(vis));
126         queue<int> Q;
127         Q.push(s);
128         d[s] = 0;
129         vis[s] = 1;
130         while (!Q.empty())
131         {
132             int x = Q.front();
133             Q.pop();
134             for (int i = 0; i < (int) G[x].size(); i++)
135             {
136                 Edge & e = edges[ G[x][i] ];
137                 if (!vis[e.to] && e.cap > e.flow)
138                 {
139                     vis[e.to] = 1;
140                     d[e.to] = d[x] + 1;
141                     Q.push(e.to);
142                 }
143             }
144         }
145         return vis[t];
146     }
147     int DFS(int x, int a)
148     {
149         if (x == t || a == 0)
150             return a;
151         int flow = 0, f;
152         for (int& i = cur[x]; i < (int)G[x].size(); i++)
153         {
154             Edge & e = edges[ G[x][i] ];
155             if (d[x] + 1 == d[e.to] && (f = DFS(e.to,  min(a, e.cap - e.flow))) > 0)
156             {
157                 e.flow += f;
158                 edges[G[x][i] ^ 1].flow -= f;
159                 flow += f;
160                 a -= f;
161                 if (a == 0)
162                     break;
163             }
164         }
165         return flow;
166     }
167     int MaxFlow()
168     {
169         int flow = 0;
170         while( BFS() )
171         {
172             memset(cur, 0, sizeof(cur));
173             flow += DFS(s, INF);
174         }
175         return flow;
176     }
177 
178 
179 }g;
180 */
181 int main()
182 {
183     int T, n, m, east, west;
184     scanf("%d", &T);
185     while (T--)
186     {
187         scanf("%d%d", &n, &m);
188         int maxx = -INF, minx = INF;
189         int x, y, w;
190         for (int i = 1; i <= n; i++)
191         {
192             scanf("%d%d", &x, &y);
193             if (x > maxx)
194             {
195                 maxx = x;
196                 west = i;
197             }
198             if (x < minx)
199             {
200                 minx = x;
201                 east = i;
202             }
203         }
204         g.init(east, west, n);
205         for (int i = 1; i <= m; i++)
206         {
207             scanf("%d%d%d", &x, &y, &w);
208             g.addEdge(x, y, w);
209         }
210         printf("%d\n", g.MaxFlow());
211     }
212     return 0;
213 }
View Code

 

posted @ 2016-04-22 17:24  zhaop  阅读(220)  评论(0编辑  收藏  举报