最大流问题的Ford-Fulkerson模板

详细讲解:http://blog.csdn.net/smartxxyx/article/details/9293665

下面贴上我的第一道最大流的题:

hdu3549

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<stdlib.h>
 4 #include<iostream>
 5 #include<string.h>
 6 #include<math.h>
 7 #include<vector>
 8 #include<map>
 9 #include<queue>
10 struct pp
11 {
12     int x;
13     int cap;
14     int pre;
15 };
16 const int N=1e8;
17 bool used[30];
18 using namespace std;
19 vector<pp>GG[30];
20 void add(int from,int to,int vv)
21 {   pp ss;
22     ss.cap=vv;ss.x=to;ss.pre=GG[to].size();
23     GG[from].push_back(ss);
24     ss.cap=0;ss.x=from;ss.pre=GG[from].size()-1;
25     GG[to].push_back(ss);
26 }
27 int dfs(int x,int y,int co)
28 {
29     if(x==y)
30     {
31         return co;
32     }
33     used[x]=true;
34     int i,j;
35     for(i=0;i<GG[x].size();i++)
36     {  int cc ;
37         pp &LL=GG[x][i];
38         if(!used[LL.x]&&LL.cap>0)
39         {
40              cc=dfs(LL.x,y,min(co,LL.cap));
41             if(cc>0)
42             {
43                 LL.cap-=cc;
44                 GG[LL.x][LL.pre].cap+=cc;
45                 return cc;
46             }
47         }
48     }
49     return 0;
50 }
51 int max_flow(int x,int t)
52 {
53     int flow=0;
54     while(1)
55     {memset(used,0,sizeof(used));
56         int kk=dfs(x,t,N);
57         if(kk==0)
58         {
59             return flow;
60         }
61         else flow+=kk;
62     }
63 
64 }
65 int main(void)
66 {
67     int i,j,k,p,q;
68     scanf("%d",&k);
69   
70     for(i=1;i<=k;i++)
71     { for(j=0;j<30;j++)
72        GG[j].clear();
73         scanf("%d %d",&p,&q);
74         int x;int y;int n,m;
75         for(j=0;j<q;j++)
76         {
77             scanf("%d %d %d",&x,&y,&n);
78             add(x,y,n);
79         }
80         int M=max_flow(1,p);
81         printf("Case %d: %d
",i,M);
82     }
83     return 0;
84 }

 DINIC算法

  1 #include<stdio.h>
  2 #include<algorithm>
  3 #include<stdlib.h>
  4 #include<iostream>
  5 #include<string.h>
  6 #include<math.h>
  7 #include<vector>
  8 #include<map>
  9 #include<queue>
 10 using namespace std;
 11 struct node
 12 {
 13         int to;
 14         int cap;
 15         int rev;
 16 };
 17 int level[20];
 18 int iter[20];
 19 vector<node>vec[20];
 20 void add_edge(int from,int to,int cap )
 21 {
 22         vec[from].push_back(node {to,cap,vec[to].size()});
 23         vec[to].push_back(node {from,0,vec[from].size()-1});
 24 }
 25 void BFS(int s);
 26 int dfs(int id,int t,int f );
 27 int max_flow(int s,int t);
 28 const int N=1e9;
 29 int main(void)
 30 {
 31         int i,j,k,p,q;
 32         int x,y;
 33         scanf("%d",&k);
 34         int s;
 35         for(s=1; s<=k; s++)
 36         {
 37                 scanf("%d %d",&p,&q);
 38                 for(i=0;i<20;i++)
 39                 {
 40                     vec[i].clear();
 41                 }
 42                 for(i=0; i<q; i++)
 43                 {
 44                         int z;
 45                         scanf("%d %d %d",&x,&y,&z);
 46                         add_edge(x,y,z);
 47                 }
 48                 int sum=max_flow(1,p);
 49                 printf("Case %d: ",s);
 50                 printf("%d
",sum);
 51         }
 52         return 0;
 53 }
 54 void BFS(int s)
 55 {
 56         memset(level,-1,sizeof(level));
 57         queue<int>que;
 58         level[s]=0;
 59         que.push(s);
 60         while(!que.empty())
 61         {
 62                 int id=que.front();
 63                 que.pop();
 64                 for(int i=0; i<vec[id].size(); i++)
 65                 {
 66                         node x=vec[id][i];
 67                         if(level[x.to]<0&&x.cap>0)
 68                         {
 69                                 level[x.to]=level[id]+1;
 70                                 que.push(x.to);
 71                         }
 72                 }
 73         }
 74 }
 75 int dfs(int id,int t,int f )
 76 {
 77         if(t==id)return f;
 78         for(int &i=iter[id]; i<vec[id].size(); i++)
 79         {
 80                 node &vv=vec[id][i];
 81                 if(level[vv.to]>level[id]&&vv.cap>0)
 82                 {
 83                         int d=dfs(vv.to,t,min(f,vv.cap));
 84                         if(d>0)
 85                         {
 86                                 vv.cap-=d;
 87                                 vec[vv.to][vv.rev].cap+=d;
 88                                 return d;
 89                         }
 90                 }
 91         }
 92         return 0;
 93 }
 94 int max_flow(int s,int t)
 95 {
 96         int flow=0;
 97        for(;;)
 98         {
 99                 BFS(s);
100                 if(level[t]<0)
101                 {
102                         return flow;
103                 }
104                 int f=0;
105                 memset(iter,0,sizeof(iter));
106                 while( (f=dfs(s,t,N))>0)
107                 {
108                 if(f==0)break;
109                         flow+=f;
110                 }
111         }
112 }
油!油!you@
原文地址:https://www.cnblogs.com/zzuli2sjy/p/5202414.html