1. 程式人生 > >最大流模板暫存

最大流模板暫存

print != class div max for sizeof 最大流 sca

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 }

最大流模板暫存