POJ1273 最大流模板

之前自己写的,以后当一个模板的基础吧,不管是最大流,最小割,二分图匹配

下面是POJ1273的一个裸题..

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <vector>
 5 #include <queue>
 6 using namespace std;
 7 struct node{
 8     int to,cap,rev;
 9     node(int _to,int _cap,int _rev):to(_to),cap(_cap),rev(_rev){}
10 };
11 const int maxn=1005;
12 vector<node> G[maxn];
13 int s,t;
14 void add(int u,int v,int cap){
15     G[u].push_back(node(v,cap,G[v].size()));
16     G[v].push_back(node(u,0,G[u].size()-1));
17 }
18 bool vis[maxn];//这个可以不要,level数组可以起两个作用,记录层数和是否被访问过,类似于dp数组
19 int level[maxn],iter[maxn];
20 void bfs(){
21     memset(level,-1,sizeof(level));
22     queue<int> q;
23     q.push(s);int i;level[s]=0;
24     while(!q.empty()){
25         int u=q.front();
26         q.pop();
27         for(i=0;i<G[u].size();++i){
28             node& e=G[u][i];
29             if(e.cap>0&&level[e.to]<0){
30                 level[e.to]=level[u]+1;
31                 q.push(e.to);                
32             }
33         }
34     }
35     //需要得到所有顶点的level信息,一方面起vis的作用,另一方面起到转移的作用
36     //而且考虑到可能同时存在多个最短增广路
37 }
38 int dfs(int v,int t,int f){
39     //printf("v:%d t:%d f:%d\n",v,t,f);
40     if(v==t) return f;
41     for(int &i=iter[v];i<G[v].size();++i){
42         node &e=G[v][i];
43         if(e.cap>0&&level[e.to]>level[v]){
44             int d=dfs(e.to,t,min(e.cap,f));
45             if(d>0){
46                 e.cap-=d;
47                 G[e.to][e.rev].cap+=d;
48                 return d;
49             }
50         }        
51     }
52     return 0;//这里忘记return 0了...
53 }
54 const int INF=~0u>>1;
55 int maxflow(){
56     int flow=0,f;
57     for(;;){
58         bfs();
59         if(level[t]<0) return flow;
60         memset(iter,0,sizeof(iter));
61         while((f=dfs(s,t,INF))>0) flow+=f; 
62     }
63 }
64 //直觉上 容量种数越少越快
65 int main(){
66     //freopen("testMaxFlow.txt","r",stdin);
67     int n,i,u,v,cap,m;
68     while(~scanf("%d%d",&m,&n)){
69         s=1;t=n;
70         for(int i=1;i<=n;++i) G[i].clear();//多组数据要清空边
71         for(i=0;i<m;++i){
72             scanf("%d%d%d",&u,&v,&cap);
73             add(u,v,cap);
74         }
75         printf("%d\n",maxflow());
76     }
77     return 0;
78 }

 

posted @ 2017-08-04 22:06  狡啮之仰  阅读(156)  评论(0编辑  收藏  举报