网络流 Drainage Ditches

#include  
#include  
#include  
#include  
#include  
#include  
#include  
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(sf[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<

你可能感兴趣的:(网络流 Drainage Ditches)