UVa820 Internet Bandwidth

最大流模板。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <vector>
  5 #include <queue>
  6 #include <iostream>
  7 using namespace std;
  8 const int MAXN = 100 + 20;
  9 const int INF = 0x3f3f3f3f;
 10 
 11 int N, S, T, C;
 12 
 13 namespace dinic
 14 {
 15     struct edge
 16     {
 17         int to, cap, rev;
 18         edge(int v = 0, int c = 0, int r = 0) : 
 19         to(v), cap(c), rev(r) {}
 20     };
 21     vector<edge> g[MAXN];
 22     int level[MAXN], iter[MAXN];
 23 
 24     inline void init()
 25     {
 26         for(int i = 0; i <= N; i++)
 27             g[i].clear();
 28         memset(level, 0, sizeof(level));
 29         memset(iter, 0, sizeof(iter));
 30     }
 31 
 32     inline void addedge(int u, int v, int c)
 33     {
 34         g[u].push_back(edge(v, c, g[v].size()));
 35         g[v].push_back(edge(u, c, g[u].size() - 1));
 36     }
 37 
 38     inline bool bfs()
 39     {
 40         queue<int> q;
 41         memset(level, -1, sizeof(level));
 42         q.push(S);
 43         level[S] = 0;
 44 
 45         while(!q.empty())
 46         {
 47             int u = q.front(); q.pop();
 48             for(int i = 0; i < (int) g[u].size(); i++)
 49             {
 50                 edge e = g[u][i];
 51                 if(e.cap && level[e.to] == -1)
 52                 {
 53                     level[e.to] = level[u] + 1;
 54                     q.push(e.to);
 55                 }
 56             }
 57         }
 58         return ~level[T];
 59     }
 60 
 61     int dfs(int u, int flow)
 62     {
 63         if(u == T) return  flow;
 64 
 65         for(int &i = iter[u]; i < (int) g[u].size(); i++)
 66         {
 67             edge &e = g[u][i];
 68             if(e.cap && level[e.to] == level[u] + 1)
 69             {
 70                 int d = dfs(e.to, min(flow, e.cap));
 71                 if(d)
 72                 {
 73                     e.cap -= d;
 74                     g[e.to][e.rev].cap += d;
 75                     return d;
 76                 }
 77             }
 78         }
 79         return 0;
 80     }
 81 
 82     int maxflow()
 83     {
 84         int d = 0, flow = 0;
 85         while(bfs())
 86         {
 87             memset(iter, 0, sizeof(iter));
 88             while(d = dfs(S, INF), d) flow += d;
 89         }
 90         return flow;
 91     }
 92 }
 93 
 94 int main()
 95 {
 96     //freopen("820.in", "r", stdin);
 97     //freopen("820.out", "w", stdout);
 98     int cnt = 0;
 99     while(cin>>N, N)
100     {
101         cnt++;
102 
103         dinic::init();
104         cin>>S>>T>>C;
105         int u, v, c;
106         for(int i = 1; i <= C; i++)
107         {
108             scanf(" %d %d %d", &u, &v, &c);
109             dinic::addedge(u, v, c);
110         }
111 
112         printf("Network %d\n", cnt);
113         printf("The bandwidth is %d.\n", dinic::maxflow());
114         puts("");
115     }
116     return 0;
117 }

 

posted @ 2018-05-13 14:55  俺是小程  阅读(133)  评论(0编辑  收藏  举报