网络流基础

匿名 (未验证) 提交于 2019-12-03 00:17:01



 1 #include<cstdio>  2 #include<iostream>  3 #include<cstring>  4 #include<algorithm>  5 #include<queue>  6 #define maxn 10010  7 #define INF 2147483647  8   9 using namespace std; 10  11 struct node 12 { 13     int ed,nxt,len; 14 }; 15 node edge[maxn*20]; 16 int n,m,cnt=-1,first[maxn],S,T,ans; 17 int pre_u[maxn],pre_e[maxn],flow[maxn]; 18 bool vis[maxn]; 19  20 inline void add_edge(int s,int e,int d) 21 { 22     ++cnt; 23     edge[cnt].ed=e; 24     edge[cnt].len=d; 25     edge[cnt].nxt=first[s]; 26     first[s]=cnt; 27     return; 28 } 29  30 inline bool bfs(int s,int t) 31 { 32     queue <int> q; 33     memset(vis,false,sizeof(vis)); 34     memset(pre_u,-1,sizeof(pre_u)); 35     memset(pre_e,-1,sizeof(pre_e)); 36     memset(flow,0,sizeof(flow)); 37     pre_u[s]=s; vis[s]=true; flow[s]=INF; 38     q.push(s); 39     while(!q.empty()) 40     { 41         int p=q.front(); q.pop(); 42         for(register int i=first[p];i!=-1;i=edge[i].nxt) 43         { 44             int e=edge[i].ed; 45             if(!vis[e]&&edge[i].len!=0) 46             { 47                 pre_u[e]=p; 48                 pre_e[e]=i; 49                 vis[e]=true; 50                 flow[e]=min(flow[p],edge[i].len); 51                 if(e==t) return true; 52                 q.push(e); 53             } 54         } 55     } 56     return false; 57 } 58  59 inline void EK() 60 { 61     while(bfs(S,T)) 62     { 63         for(register int i=T;i!=S;i=pre_u[i]) 64         { 65             edge[pre_e[i]].len-=flow[T]; 66             edge[pre_e[i]^1].len+=flow[T]; 67         } 68         ans+=flow[T]; 69     } 70     return; 71 } 72  73 int main() 74 { 75     memset(first,-1,sizeof(first)); 76     scanf("%d%d%d%d",&n,&m,&S,&T); 77     for(register int i=1;i<=m;++i) 78     { 79         int s,e,d; 80         scanf("%d%d%d",&s,&e,&d); 81         add_edge(s,e,d); 82         add_edge(e,s,0); 83     } 84     EK(); 85     printf("%d\n",ans); 86     return 0; 87 }


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!