zoukankan      html  css  js  c++  java
  • POJ 3469 Dinic (二元关系)

    题意:
    这里写图片描述
    思路:
    这里写图片描述

    //By SiriusRen
    #include <queue>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define mem(x,y) memset(x,y,sizeof(x))
    const int N=20005,M=880005;
    int first[N],vis[N],next[M],v[M],w[M],tot,xx,yy,zz,n,m,T,ans;
    void Add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}
    void add(int x,int y,int z){Add(x,y,z),Add(y,x,0);}
    bool tell(){
        queue<int>q;q.push(0);
        memset(vis,-1,sizeof(vis)),vis[0]=0;
        while(!q.empty()){
            int t=q.front();q.pop();
            for(int i=first[t];~i;i=next[i])if(!~vis[v[i]]&&w[i])
                vis[v[i]]=vis[t]+1,q.push(v[i]);
        }return ~vis[T];
    }
    int zeng(int x,int y){
        if(x==T)return y;
        int r=0;
        for(int i=first[x];~i&&y>r;i=next[i])
            if(vis[v[i]]==vis[x]+1&&w[i]){
                int t=zeng(v[i],min(y-r,w[i]));
                w[i]-=t,w[i^1]+=t,r+=t;
            }
        if(!r)vis[x]=-1;
        return r;
    }
    int main(){
        mem(first,-1),scanf("%d%d",&n,&m),T=n+1;
        for(int i=1;i<=n;i++)scanf("%d%d",&xx,&yy),add(0,i,xx),add(i,T,yy);
        for(int i=1;i<=m;i++)scanf("%d%d%d",&xx,&yy,&zz),add(xx,yy,zz),add(yy,xx,zz);
        while(tell())while(xx=zeng(0,0x3f3f3f3f))ans+=xx;
        printf("%d
    ",ans);
    }

    这里写图片描述

  • 相关阅读:
    java集合Collection常用方法详解
    JavaWeb_cookie和session
    JavaWeb_Cookie
    Java中双向链表
    Java链表基础
    select函数详解及实例分析
    socket select函数的详细讲解
    记录远程用户登录日志
    MSSQL grant
    dll 中使用ADO
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532060.html
Copyright © 2011-2022 走看看