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 }
来源:博客园
作者:Hoyoak
链接:https://www.cnblogs.com/Hoyoak/p/11800291.html