HDU 1532Drainage Ditches

題意

草地排水

網絡流

代碼

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<queue>
#define For(i,j,k) for(int i=(j);i<=(int)k;i++)
#define Forr(i,j,k) for(int i=(j);i>=(int)k;i--)
#define Set(a,b) memset(a,b,sizeof(a))
#define Rep(i,u) for(int i=Begin[u],v=to[i];i;i=Next[i],v=to[i])
using namespace std;
const int N=210,INF=0x3f3f3f3f;
int Begin[N],Next[N<<1],to[N<<1],e=1,f[N<<1],n,m;
inline void add(int x,int y,int z){
    to[++e]=y,Next[e]=Begin[x],Begin[x]=e,f[e]=z;
}
template<class T>inline void chkmin(T &a,T b){a=(a>b)?b:a;}
template<class T>inline void chkmax(T &a,T b){a=(a<b)?b:a;}
inline void read(int &x){
    x=0;char c=getchar();int f(0);
    while(c<'0'||c>'9')f|=(c=='-'),c=getchar();
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
    x=f?-x:x;
}
struct isap{
    int s,t,p[N],gap[N],cur[N],d[N];
    #define Retr(u) for(u=t;u^s;u=to[p[u]^1])
    inline void init(){
        queue<int>q;
        For(i,0,n)cur[i]=Begin[i],d[i]=INF,gap[i]=0;
        d[t]=0;gap[0]=1;
        q.push(t);
        while(!q.empty()){
            int r=q.front();q.pop();
            Rep(i,r)
                if(f[i^1]&&d[v]>d[r]+1)
                    ++gap[d[v]=d[r]+1],q.push(v);
        }
    }
    inline int Augment(){
        int u,a=INF;
        Retr(u)chkmin(a,f[p[u]]);
        Retr(u)f[p[u]]-=a,f[p[u]^1]+=a;
        return a;
    }
    inline int Maxflow(int S,int T){
        int flow=0,u=s=S,i;t=T;
        init();
        while(d[s]<n){
            if(u==t)flow+=Augment(),u=s;
            for(i=cur[u];i;i=Next[i])
                if(f[i]&&d[u]==d[to[i]]+1)break;
            if(!i){
                if((--gap[d[u]])==0)break;
                cur[u]=Begin[u];d[u]=n;
                Rep(i,u)
                    if(f[i])chkmin(d[u],d[to[i]]+1);
                gap[d[u]]++;
                if(u!=s)u=to[p[u]^1];
            }else cur[u]=i,p[u=to[i]]=i;
        }
        return flow;
    }
}F;
int main(){
    while(scanf("%d%d",&m,&n)==2){
        Set(Begin,0);e=1;
        For(i,1,m){
            int u,v,w;
            read(u),read(v),read(w);
            add(u,v,w),add(v,u,0);
        }
        printf("%d\n",F.Maxflow(1,n));
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章