poj 1273 Drainage Ditches(网络流基础)

http://poj.org/problem?id=1273

增广路算法。

Ford_Fullkerson
  1 /*
  2 Author:Zhaofa Fang
  3 Lang:C++
  4 */
  5 #include <cstdio>
  6 #include <cstdlib>
  7 #include <iostream>
  8 #include <cmath>
  9 #include <cstring>
 10 #include <algorithm>
 11 #include <string>
 12 #include <utility>
 13 #include <vector>
 14 #include <queue>
 15 #include <stack>
 16 #include <map>
 17 #include <set>
 18 using namespace std;
 19 
 20 typedef long long ll;
 21 const int INF = 2147483647;
 22 
 23 struct Edge
 24 {
 25     int v,c,next;
 26 }edge[1005];
 27 int eh[505],pp;
 28 int pre[505];
 29 int G[505][505];
 30 void init()
 31 {
 32     pp = 0;
 33     memset(eh,-1,sizeof(eh));
 34     memset(G,0,sizeof(G));
 35 }
 36 void add(int u,int v,int c)
 37 {
 38     edge[pp].v=v;
 39     edge[pp].c=c;
 40     edge[pp].next=eh[u];
 41     eh[u]=pp++;
 42 }
 43 void addedge(int u,int v,int c)
 44 {
 45     add(u,v,c);
 46     G[u][v]+=c;
 47     add(v,u,0);
 48     G[v][u]+=0;
 49 }
 50 int bfs(int s,int t)
 51 {
 52     queue<int> q;
 53     bool vist[505];
 54     memset(vist,0,sizeof(vist));
 55     q.push(s);
 56     vist[s]=1;
 57     while(!q.empty())
 58     {
 59         int now=q.front();q.pop();
 60         for(int i=eh[now];i!=-1;i=edge[i].next)
 61         {
 62             int v=edge[i].v;
 63             if(G[now][v] > 0 && !vist[v])
 64             {
 65                 vist[v]=1;
 66                 pre[v]=now;
 67                 if(v == t)return 1;
 68                 q.push(v);
 69             }
 70         }
 71     }
 72     return 0;
 73 }
 74 int Ford_Fullkerson(int s,int t,int &F)
 75 {
 76     memset(pre,0,sizeof(pre));
 77     int min=INF;
 78     if(bfs(s,t) == 0)return 0;
 79     for(int i=t;i!=s;i=pre[i])
 80     {
 81         if(G[pre[i]][i] < min)min=G[pre[i]][i];
 82     }
 83     for(int i=t;i!=s;i=pre[i])
 84     {
 85         G[pre[i]][i] -= min;
 86         G[i][pre[i]] += min;
 87     }
 88     F += min;
 89     return 1;
 90 }
 91 int main()
 92 {
 93     #ifndef ONLINE_JUDGE
 94     freopen("in","r",stdin);
 95     #endif
 96     int m,n;
 97     while(~scanf("%d%d",&m,&n))
 98     {
 99         int u,c,v;
100         init();
101         while(m--)
102         {
103             scanf("%d%d%d",&u,&v,&c);
104             addedge(u,v,c);
105         }
106         int F = 0;
107         while(Ford_Fullkerson(1,n,F));
108         cout<<F<<endl;
109     }
110     return 0;
111 }

sap_gap.

  1 /*
  2 Author:Zhaofa Fang
  3 Lang:C++
  4 */
  5 #include <cstdio>
  6 #include <cstdlib>
  7 #include <iostream>
  8 #include <cmath>
  9 #include <cstring>
 10 #include <algorithm>
 11 #include <string>
 12 #include <vector>
 13 #include <queue>
 14 #include <stack>
 15 #include <map>
 16 #include <set>
 17 using namespace std;
 18 
 19 typedef long long ll;
 20 const int INF = 2147483647;
 21 
 22 struct edge
 23 {
 24     int u,v;
 25     int cap,flow;
 26     int next;
 27 };
 28 int eh[505],tot;
 29 edge et[505<<1];
 30 void add(int u,int v,int cap,int flow)
 31 {
 32     edge E={u,v,cap,flow,eh[u]};
 33     et[tot]=E,eh[u]=tot++;
 34 }
 35 void addedge(int u,int v,int cap)
 36 {
 37     add(u,v,cap,0);add(v,u,0,0);
 38 }
 39 int cur[505],cnt[505],dist[505],pre[505];
 40 int low[505];
 41 int sap_gap(int s,int t,int n)
 42 {
 43     int u,v,now;
 44     memset(dist,0,sizeof(dist));
 45     memset(low,0,sizeof(low));
 46     for(u=0;u<=n;u++)cur[u] = eh[u];
 47     int flow=0;
 48     u = s;
 49     low[s] = INF;cnt[0] = n;
 50     while(dist[s] < n)
 51     {
 52         for(now = cur[u];now != -1;now = et[now].next)
 53             if(et[now].cap - et[now].flow && dist[u] == dist[v = et[now].v] + 1)break;
 54         if(now != -1)
 55         {
 56             cur[u] = now;pre[v] = now;
 57             low[v] = et[now].cap - et[now].flow;
 58             low[v] = min(low[v],low[u]);
 59             u = v;
 60             if(u == t)
 61             {
 62                 for(;u != s;u = et[pre[u]].u)
 63                 {
 64                     et[pre[u]].flow += low[t];
 65                     et[pre[u]^1].flow -= low[t];
 66                 }
 67                 flow += low[t];low[s] = INF;
 68             }
 69         }
 70         else
 71         {
 72             if(--cnt[dist[u]] == 0)break;
 73             dist[u] = n;cur[u] = eh[u];
 74             for(now = eh[u];now != -1;now = et[now].next)
 75                 if(et[now].cap-et[now].flow > 0 && dist[u] > dist[et[now].v] + 1)
 76                     dist[u] = dist[et[now].v] + 1;
 77                 cnt[dist[u]]++;
 78                 if(u != s)u = et[pre[u]].u;
 79         }
 80     }
 81     return flow;
 82 }
 83 int n,m;
 84 void init()
 85 {
 86     tot = 0;
 87     memset(eh,-1,sizeof(eh));
 88 }
 89 
 90 int main()
 91 {
 92     #ifndef ONLINE_JUDGE
 93     freopen("in","r",stdin);
 94     #endif
 95     int a,b,c;
 96     while(~scanf("%d%d",&m,&n))
 97     {
 98         init();
 99         for(int i=1;i<=m;i++)
100         {
101             scanf("%d%d%d",&a,&b,&c);
102             addedge(a,b,c);
103 
104         }
105         printf("%d\n",sap_gap(1,n,n));
106     }
107     return 0;
108 }
sap

Dinic.O(V*V*E)

  1 Source Code
  2 
  3 Problem: 1273        User: qq6616323
  4 Memory: 716K        Time: 0MS
  5 Language: G++        Result: Accepted
  6 Source Code
  7 /*
  8  *Author:       Zhaofa Fang
  9  *Created time: 2013-07-13-10.25
 10  *Language:     C++
 11  */
 12 #include <cstdio>
 13 #include <cstdlib>
 14 #include <sstream>
 15 #include <iostream>
 16 #include <cmath>
 17 #include <cstring>
 18 #include <algorithm>
 19 #include <string>
 20 #include <utility>
 21 #include <vector>
 22 #include <queue>
 23 #include <map>
 24 #include <set>
 25 using namespace std;
 26 
 27 typedef long long ll;
 28 #define DEBUG(x) cout<< #x << ':' << x << endl
 29 #define FOR(i,s,t) for(int i = (s);i <= (t);i++)
 30 #define FORD(i,s,t) for(int i = (s);i >= (t);i--)
 31 #define REP(i,n) for(int i=0;i<(n);i++)
 32 #define REPD(i,n) for(int i=(n-1);i>=0;i--)
 33 #define PII pair<int,int>
 34 #define PB push_back
 35 #define MP make_pair
 36 #define ft first
 37 #define sd second
 38 #define lowbit(x) (x&(-x))
 39 #define INF (1<<30)
 40 #define eps 1e-8
 41 
 42 const int maxn = 505;
 43 const int maxm = 1010;
 44 struct Edge{
 45     int v,cap,flow,next;
 46 }edge[maxm];
 47 int eh[maxn],tot;
 48 int d[maxn];
 49 bool vist[maxn];
 50 
 51 void init(){
 52     tot = 0;
 53     memset(eh,-1,sizeof(eh));
 54 }
 55 void addedge(int u,int v,int c,int f){
 56     Edge e = {v,c,f,eh[u]};
 57     edge[tot] = e;
 58     eh[u] = tot ++;
 59 }
 60 void add(int u,int v,int c,int f){
 61     addedge(u,v,c,f);
 62     addedge(v,u,f,0);
 63 }
 64 
 65 bool BFS(int s,int t){
 66     memset(vist,0,sizeof(vist));
 67     queue<int>Q;
 68     Q.push(s);
 69     d[s] = 0;
 70     vist[s] = 1;
 71     while(!Q.empty()){
 72         int u = Q.front();
 73         Q.pop();
 74         for(int i=eh[u];i!=-1;i=edge[i].next){
 75             int v = edge[i].v;
 76             if(!vist[v] && edge[i].cap>edge[i].flow){
 77                  vist[v] = 1;
 78                  d[v] = d[u] + 1;
 79                  Q.push(v);
 80             }
 81         }
 82     }
 83     return vist[t];
 84 }
 85 int DFS(int u,int t,int avi){
 86     if(u == t || avi == 0)return avi;
 87     int flow = 0 , f;
 88     for(int i=eh[u];i!=-1;i=edge[i].next){
 89         int v = edge[i].v;
 90         if(d[u] + 1 == d[v] && (f=DFS(v,t,min(avi,edge[i].cap-edge[i].flow)))>0){
 91             edge[i].flow += f;
 92             edge[i^1].flow -= f;
 93             flow += f;
 94             avi -= f;
 95             if(avi == 0)break;
 96         }
 97     }
 98     return flow;
 99 }
100 int maxFlow(int s,int t){
101     int flow = 0;
102     while(BFS(s,t)){
103         flow += DFS(s,t,INF);
104     }
105     return flow;
106 }
107 int main(){
108     //freopen("in","r",stdin);
109     //freopen("out","w",stdout);
110     int n,m;
111     while(~scanf("%d%d",&n,&m)){
112         int u,v,c;
113         init();
114         while(n --){
115             scanf("%d%d%d",&u,&v,&c);
116             add(u,v,c,0);
117         }
118         printf("%d\n",maxFlow(1,m));
119     }
120     return 0;
121 }
Dinic
by Farmer
原文地址:https://www.cnblogs.com/fzf123/p/2697759.html