美文网首页
网络流 Drainage Ditches

网络流 Drainage Ditches

作者: 书臆 | 来源:发表于2017-08-17 16:02 被阅读0次
    #include<cstdio>  
    #include<vector>  
    #include<queue>  
    #include<map>  
    #include<cmath>  
    #include<cstring>  
    #include<algorithm>  
    const int maxn=200+10,inf=1000000000;  
    using namespace std;  
    bool p[maxn],flag=true;  
    int c[maxn][maxn],f[maxn][maxn],pre[maxn],q[maxn*2]; 
    int main(){   
        //freopen("ditch.in","r",stdin);  
        //freopen("ditch.out","w",stdout);  
        int i,j,k,m,n,x,y,z,pj;  
        cin>>m>>n;  
        for(i=1;i<=m;i++){         
            scanf("%d%d%d",&x,&y,&z);  
            c[x][y]+=z;  
        }
        while(flag){  
            flag=false;  
            int s=0,t=1;  
            memset(p,0,sizeof(p));  
            q[1]=1;p[1]=1;  
            while(s<t){  
                s++;  
                int u=q[s];  
                for(i=1;i<=n;i++)  
                    if(!p[i] && c[u][i]>f[u][i]){  
                        q[++t]=i;  
                        pre[i]=u;  
                        p[i]=1;   
                        if(i==n){flag=true;break;}    
                    }             
                if(flag)break;  
            }  
            k=n;pj=inf;  
            while(pre[k]){pj=min(pj,c[pre[k]][k]-f[pre[k]][k]);k=pre[k];}                
            k=n;  
            while(pre[k]){  
                f[pre[k]][k]+=pj;  
                c[k][pre[k]]+=pj;  
                k=pre[k];  
            }             
        }  
        int ans=0;  
        for(i=2;i<=n;i++)  
            ans+=f[1][i];  
        cout<<ans<<endl;  
        return 0;  
    }

    相关文章

      网友评论

          本文标题:网络流 Drainage Ditches

          本文链接:https://www.haomeiwen.com/subject/qzcnrxtx.html