美文网首页
网络流 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