最大流问题的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\n",i,M);
82     }
83     return 0;
84 }

 

你可能感兴趣的:(最大流问题的Ford-Fulkerson模板)