USACO4.2.1 网络流最大流算法

来源:互联网 发布:淘宝质量好的牛仔裤 编辑:程序博客网 时间:2024/06/01 20:48
/*ID:hk945801TASK:ditchLANG:C++*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int inf=10000001;struct node{int c,f;}a[201][201];int p[201*201],d[201*201],pre[201];int main(){int i,j,k,m,n;int x;freopen("ditch.in","r",stdin);freopen("ditch.out","w",stdout);cin>>m>>n;      for(i=1;i<=m;i++){    int x,y,z;          scanf("%d%d%d",&x,&y,&z);                            a[x][y].c+=z;      }     int pd=1;    while(pd){    pd=0;    int fi=0,l=1;    d[1]=1;    for(i=1;i<=n;i++)p[i]=0;          p[1]=1;          while(fi<l){              fi++;        x=d[fi];            for(i=2;i<=n;i++)                if(!p[i] && (a[x][i].c>a[x][i].f || a[i][x].f>0)){                      d[++l]=i;                    p[i]=1;                    pre[i]=x;                    if(i==n){pd=1;break;}                  }                     if(pd==1)break;          }          if(pd==0)break;          int min=inf;          x=n;          while(x!=1){              if(a[pre[x]][x].c>a[pre[x]][x].f&& a[pre[x]][x].c-a[pre[x]][x].f<min)                  min=a[pre[x]][x].c-a[pre[x]][x].f;                         else if(a[x][pre[x]].f>0 && a[x][pre[x]].f<min)                  min=a[x][pre[x]].f;              x=pre[x];          }          x=n;          while(x!=1){              if(a[pre[x]][x].c>a[pre[x]][x].f)                  a[pre[x]][x].f+=min;                          else if(a[x][pre[x]].f>0)                  a[x][pre[x]].f-=min;              x=pre[x];        }}int ans=0;      for(i=2;i<=n;i++)          ans+=a[1][i].f;      cout<<ans<<endl;return 0;}

0 0
原创粉丝点击