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

最大流模板暂存

时间:2017-10-22 01:34:25      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:==   c++   log   pop   最大   size   ace   style   queue   

1、

 1 #include<bits/stdc++.h>
 2 using namespace std;  
 3 struct Edge{
 4     int to; 
 5     int w;
 6     int nxt;  
 7 }e[5000005];  
 8 int n,m,s,t,tot;
 9 int head[5005];  
10 int d[5005];  
11 void add_edge(int u,int v,int w){  
12     e[tot].to=v;  
13     e[tot].w=w;  
14     e[tot].nxt=head[u];  
15     head[u]=tot++;
16     e[tot].to=u;  
17     e[tot].w=0;  
18     e[tot].nxt=head[v];  
19     head[v]=tot++;
20 }  
21 bool bfs(){
22     queue<int>Q;
23     Q.push(s);
24     memset(d,0,sizeof d);
25     d[s]=1;  
26     while(!Q.empty()){
27         int u=Q.front(); 
28         Q.pop(); 
29         for(int i=head[u];i!=-1;i=e[i].nxt){ 
30             int v=e[i].to;  
31             if(d[v]==0&&e[i].w>0){
32                 d[v]=d[u]+1; 
33                 Q.push(v);
34             }  
35         }  
36     }  
37     return d[t]!=0;  
38 }  
39   
40 int dfs(int u,int flow){
41     if(u==t)return flow;  
42     int ans=0,x=0;
43     for(int i=head[u];i!=-1;i=e[i].nxt){
44         int v=e[i].to;
45         if (e[i].w>0&&d[v]==d[u]+1){
46             x=dfs(v,min(flow-ans,e[i].w));  
47             ans+=x;  
48             e[i].w-=x;  
49             e[i^1].w+=x;
50             if(ans==flow) return flow;  
51         }  
52     }  
53     if(ans==0) d[u]=0;  
54     return ans;  
55 }  
56   
57 int dinic(){
58     int ans=0;  
59     while(bfs()) ans+=dfs(s,INT_MAX);  
60     return ans; 
61 }  
62 
63 int main(){
64     int t,u,v,f;
65     scanf("%d",&t);
66     while(t--){
67         memset(head,-1,sizeof head);
68         tot=0;
69         scanf("%d%d",&n,&m);
70         for(int i=0;i<m;i++){
71             scanf("%d%d%d",&u,&v,&f);
72             add_edge(u-1,v-1,f);
73         }
74         s=0,t=n-1;
75         int ans=dinic();
76         printf("%d\n",ans);
77     }
78     return 0;
79 }

2、

 1 #include<bits/stdc++.h>
 2 using namespace std;  
 3 struct Edge{
 4     int to; 
 5     int w;
 6     int nxt;  
 7 }e[5000005];  
 8 int n,m,s,t,tot;
 9 int head[5005];  
10 int d[5005];  
11 void add_edge(int u,int v,int w){  
12     e[tot].to=v;  
13     e[tot].w=w;  
14     e[tot].nxt=head[u];  
15     head[u]=tot++;
16     e[tot].to=u;  
17     e[tot].w=0;  
18     e[tot].nxt=head[v];  
19     head[v]=tot++;
20 }  
21 bool bfs(){
22     queue<int>Q;
23     Q.push(s);
24     memset(d,0,sizeof d);
25     d[s]=1;  
26     while(!Q.empty()){
27         int u=Q.front(); 
28         Q.pop(); 
29         for(int i=head[u];i!=-1;i=e[i].nxt){ 
30             int v=e[i].to;  
31             if(d[v]==0&&e[i].w>0){
32                 d[v]=d[u]+1; 
33                 Q.push(v);
34             }  
35         }  
36     }  
37     return d[t]!=0;  
38 }  
39   
40 int dfs(int u,int flow){
41     if(u==t)return flow;  
42     int ans=0,x=0;
43     for(int i=head[u];i!=-1;i=e[i].nxt){
44         int v=e[i].to;
45         if (e[i].w>0&&d[v]==d[u]+1){
46             x=dfs(v,min(flow-ans,e[i].w));  
47             ans+=x;  
48             e[i].w-=x;  
49             e[i^1].w+=x;
50             if(ans==flow) return flow;  
51         }  
52     }  
53     if(ans==0) d[u]=0;  
54     return ans;  
55 }  
56   
57 int dinic(){
58     int ans=0;  
59     while(bfs()) ans+=dfs(s,INT_MAX);  
60     return ans; 
61 }  
62 
63 int main(){
64     int t,u,v,f;
65     scanf("%d",&t);
66     while(t--){
67         memset(head,-1,sizeof head);
68         tot=0;
69         scanf("%d%d",&n,&m);
70         for(int i=0;i<m;i++){
71             scanf("%d%d%d",&u,&v,&f);
72             add_edge(u-1,v-1,f);
73         }
74         s=0,t=n-1;
75         int ans=dinic();
76         printf("%d\n",ans);
77     }
78     return 0;
79 }

 

最大流模板暂存

标签:==   c++   log   pop   最大   size   ace   style   queue   

原文地址:http://www.cnblogs.com/elpsycongroo/p/7707378.html

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