码迷,mamicode.com
首页 > 其他好文 > 详细

POJ1273 最大流模板

时间:2017-08-05 00:19:05      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:stdin   iostream   freopen   数组   open   color   for   name   const   

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

下面是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 }

 

POJ1273 最大流模板

标签:stdin   iostream   freopen   数组   open   color   for   name   const   

原文地址:http://www.cnblogs.com/linkzijun/p/7287343.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!