5 4 1 2 40 1 4 20 2 4 20 2 3 30 3 4 10Sample Output
50
最大流的模板 考虑重边
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdlib> 6 #include<string.h> 7 #include<set> 8 #include<vector> 9 #include<queue> 10 #include<stack> 11 #include<map> 12 #include<cmath> 13 typedef long long ll; 14 typedef unsigned long long LL; 15 using namespace std; 16 const double PI=acos(-1.0); 17 const double eps=0.0000000001; 18 const int INF=1e9; 19 const int N=1000+100; 20 int mp[N][N]; 21 int vis[N]; 22 int pre[N]; 23 int m,n; 24 int BFS(int s,int t){ 25 queue<int>q; 26 memset(pre,-1,sizeof(pre)); 27 memset(vis,0,sizeof(vis)); 28 pre[s]=0; 29 vis[s]=1; 30 q.push(s); 31 while(!q.empty()){ 32 int p=q.front(); 33 q.pop(); 34 for(int i=1;i<=n;i++){ 35 if(mp[p][i]>0&&vis[i]==0){ 36 pre[i]=p; 37 vis[i]=1; 38 if(i==t)return 1; 39 q.push(i); 40 } 41 } 42 } 43 return false; 44 } 45 int EK(int s,int t){ 46 int flow=0; 47 while(BFS(s,t)){ 48 //BFS(s,t); 49 int dis=INF; 50 for(int i=t;i!=s;i=pre[i]) 51 dis=min(mp[pre[i]][i],dis); 52 for(int i=t;i!=s;i=pre[i]){ 53 mp[pre[i]][i]=mp[pre[i]][i]-dis; 54 mp[i][pre[i]]=mp[i][pre[i]]+dis; 55 } 56 flow=flow+dis; 57 } 58 return flow; 59 } 60 int main(){ 61 while(scanf("%d%d",&n,&m)!=EOF){ 62 memset(mp,0,sizeof(mp)); 63 for(int i=0;i<n;i++){ 64 int u,v,w; 65 scanf("%d%d%d",&u,&v,&w); 66 mp[u][v]=mp[u][v]+w; 67 } 68 int ans=EK(1,m); 69 cout<<ans<<endl; 70 } 71 72 }
hdu 1532 Drainage Ditches(最大流)
原文:http://www.cnblogs.com/Aa1039510121/p/7138823.html