poj 1273 Drainage Ditches

来源:互联网 发布:usb转网络接口怎么驱动 编辑:程序博客网 时间:2024/05/16 11:47

题目大意:对于一个排水系统,求它的最大排水速度。

即最大流,用的是标号增广路算法。

#include <stdio.h>#include <string.h>#include <math.h>#define INF 100000000int min(int a,int b){if(a>b)return b;elsereturn a;}struct node{int c,f;}map[210][210];int m,n,flag[210],prev[210],alpha[210];int queue[300];int qs,qe,v;void ford(){int i;while(1){memset(flag,-1,sizeof(flag));memset(alpha,-1,sizeof(alpha));memset(prev,-1,sizeof(prev));flag[1]=0;prev[1]=1;alpha[1]=INF;qs=0;qe=1;queue[0]=1;while(qs<qe&&flag[n]==-1){v=queue[qs]; qs++;for(i=1;i<=n;i++){if(flag[i]==-1){if(map[v][i].c<INF&&map[v][i].f<map[v][i].c){flag[i]=0;prev[i]=v;alpha[i]=min(alpha[v],map[v][i].c-map[v][i].f);queue[qe++]=i;}else if(map[i][v].c<INF&&map[i][v].f>0){flag[i]=0;prev[i]=-v;alpha[i]=min(alpha[v],map[i][v].f);queue[qe++]=i;}}}flag[v]=1;}if(flag[n]==-1||alpha[n]==0)break;int k1=n,k2=abs(prev[k1]);int a=alpha[n];while(1){if(map[k2][k1].f<INF)map[k2][k1].f+=a;else map[k1][k2].f-=a;if(k2==1)break;k1=k2;k2=abs(prev[k2]);}}int max=0;for(i=2;i<=n;i++){if(map[1][i].c<INF)max+=map[1][i].f;if(map[i][1].c<INF)max-=map[i][1].f;}printf("%d\n",max);}int main(){int i,j;int x,y,w;while(scanf("%d%d",&m,&n)!=EOF){for(i=1;i<=n;i++)for(j=1;j<=n;j++){map[i][j].c=INF;map[i][j].f=0;}for(i=0;i<m;i++){scanf("%d%d%d",&x,&y,&w);if(map[x][y].c<INF)map[x][y].c+=w;elsemap[x][y].c=w;}ford();}return 0;}


 

 

原创粉丝点击