详细讲解: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 }
时间: 2024-10-06 20:53:33