标签:
看了几天的网络流 没怎么看懂 看看停停 先把最大流搞了一下
最大流就是从出发点到终点的最大流量。
先要搞清楚残量网络,也就是做完这些后还能走多少。
还有就是增广路(个人理解:走完这条路后,剩余的还能怎么走,走多少,并相加);
hdu1532这题比较简单 也差不多是EK算法的模版
1 /*hdu1532*/ 2 #include<stdio.h> 3 #include<string.h> 4 #include<queue> 5 #define maxint 99999999 6 using namespace std; 7 queue<int>q; 8 int n,m; 9 int c[1003][1003],f[1003][1005]; //c流量 f为流了多少 10 int a[1000],pre[1000]; //pre记录其父亲 11 int min(int x,int y) 12 { 13 return x<y?x:y; 14 } 15 int EK(int s,int t) 16 { 17 int i,j; 18 int v; 19 int res=0; 20 memset(f,0,sizeof(f)); 21 while(1) 22 { 23 memset(a,0,sizeof(a)); 24 a[s]=maxint; 25 q.push(s); 26 while(!q.empty()) 27 { 28 int u=q.front(); 29 q.pop(); 30 for(v=1;v<=m;v++) 31 { 32 33 if(!a[v]&&c[u][v]>f[u][v]) 34 { 35 pre[v]=u; 36 q.push(v); 37 a[v]=min(a[u],c[u][v]-f[u][v]); 38 } 39 } 40 } 41 if(a[t]==0) 42 break; 43 res+=a[t]; 44 for(v=t;v!=s;v=pre[v]) 45 { 46 f[pre[v]][v]+=a[t]; 47 f[v][pre[v]]-=a[t]; 48 } 49 } 50 return res; 51 } 52 int main() 53 { 54 int i,j; 55 while(scanf("%d%d",&n,&m)!=EOF) 56 { 57 memset(c,0,sizeof(c)); 58 for(i=0;i<n;i++) 59 { 60 int x,y,z; 61 scanf("%d%d%d",&x,&y,&z); 62 c[x][y]+=z; 63 } 64 int ans=EK(1,m); 65 printf("%d\n",ans); 66 } 67 }
标签:
原文地址:http://www.cnblogs.com/sweat123/p/4472003.html