最大流入门代码

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <string>
  7 #include <vector>
  8 #include <set>
  9 #include <map>
 10 #include <stack>
 11 #include <queue>
 12 #include <sstream>
 13 #include <iomanip>
 14 using namespace std;
 15 typedef long long LL;
 16 const int INF = 0x4fffffff;
 17 const double EXP = 1e-5;
 18 const int MS = 10005;
 19 const int SIZE = 10005;
 20 
 21 struct edge
 22 {
 23     int c, f;
 24 }edges[MS][MS];
 25 
 26 int n, m;
 27 
 28 int flag[MS];
 29 int pre[MS];
 30 int alpha[MS];
 31 
 32 int que[SIZE];
 33 
 34 int u;
 35 int qs, qe;
 36 int i, j;
 37 
 38 void ford()
 39 {
 40     while (1)
 41     {
 42         //  label method
 43         memset(flag, 0xff, sizeof(flag));
 44         memset(pre, 0xff, sizeof(pre));
 45         memset(alpha, 0xff, sizeof(alpha));
 46         flag[0] = 0;
 47         pre[0] = 0;
 48         alpha[0] = INF;
 49         qs = qe = 0;
 50         que[qe++] = 0;
 51 
 52         while (qs < qe&&flag[n - 1] == -1)
 53         {
 54             u = que[qs++];
 55             for (int i = 0; i < n; i++)
 56             {
 57                 if (flag[i] == -1)
 58                 {
 59                     if (edges[u][i].c < INF&&edges[u][i].f < edges[u][i].c)
 60                     {
 61                         flag[i] = 0; pre[i] = u;
 62                         alpha[i] = min(alpha[u], edges[u][i].c - edges[u][i].f);
 63                         que[qe++] = i;
 64                     }
 65                     else if (edges[i][u].c<INF&&edges[i][u].f>0)
 66                     {
 67                         flag[i] = 0; pre[i] = -u;
 68                         alpha[i] = min(alpha[u], edges[i][u].f);
 69                         que[qe++] = i;
 70                     }
 71                 }
 72             }
 73             flag[u] = 1;
 74         }    //  END OF WHILE
 75         if (flag[n - 1] == -1 || alpha[n - 1] == 0)
 76             break;       //  END OF WHILE
 77 
 78         int k1 = n - 1, k2 = abs(pre[k1]);
 79         int a = alpha[n - 1];
 80         while (1)
 81         {
 82             if (edges[k2][k1].f < INF)         //用f是否==INF来判断正向
 83                 edges[k2][k1].f += a;
 84             else
 85                 edges[k1][k2].f -= a;
 86             if (k2 == 0)
 87                 break;
 88             k1 = k2;
 89             k2 = abs(pre[k1]);
 90         }     //  END OF WHILE
 91     }  //  END OF WHILE
 92 
 93     int max_flow = 0;
 94     for (int i = 0; i < n; i++)
 95     {
 96         for (int j = 0; j < n; j++)
 97         {
 98             if (i == 0 && edges[i][j].f < INF)
 99                 max_flow += edges[i][j].f;
100             if (edges[i][j].f < INF)
101                 printf("%d-->%d: %d\n", i, j, edges[i][j].f);
102         }
103     }
104     printf("max_flow = %d\n\n", max_flow);
105 }
106 
107 int main()
108 {
109     int u, v, c, f;
110     scanf("%d%d", &n, &m);
111     for (int i = 0; i < n; i++)
112     for (int j = 0; j < n; j++)
113         edges[i][j].c = edges[i][j].f = INF;
114     for (int i = 0; i < m; i++)
115     {
116         scanf("%d%d%d%d", &u, &v, &c, &f);
117         edges[u][v].c = c;
118         edges[u][v].f = f;
119     }
120     ford();
121     return 0;
122 }

 

posted @ 2015-04-06 18:28  daydaycode  阅读(122)  评论(0)    收藏  举报