zoukankan      html  css  js  c++  java
  • hdu 6214 : Smallest Minimum Cut 【网络流】

    题目链接

    ISAP写法

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    
    namespace FastIO
    {
        const static int MX=1e6;
        bool IOerror=0;
        char nc()
        {
            static char buf[MX],*p1=buf+MX,*pend=buf+MX;
            if(p1==pend)
            {
                p1=buf;
                pend=buf+fread(buf,1,MX,stdin);
                if(pend==p1)
                {
                    IOerror=1;
                    return -1;
                }
            }
            return *p1++;
        }
        inline bool blank(char ch)
        {
            return ch==' '||ch=='
    '||ch=='
    '||ch=='	';
        }
        inline int read(int& x)    
        {
            char ch;
            while(blank(ch=nc()));
            if(IOerror) return 0;
            for(x=ch-'0'; (ch=nc())>='0'&&ch<='9'; x=x*10+ch-'0'); //printf("%d===
    ",x);
            return 1;
        }
        inline int read(LL& x)    
        {
            char ch;
            while(blank(ch=nc()));
            if(IOerror) return 0;
            for(x=ch-'0'; (ch=nc())>='0'&&ch<='9'; x=x*10+ch-'0'); //printf("%d===
    ",x);
            return 1;
        }
    }
    using namespace FastIO;
    
    const int MAXN=210,MAXM=2020,MO=1024;
    const int INF = 0x3f3f3f3f;
    struct Edge
    {
        int to,next,cap,flow;
        Edge() {}
        Edge(int _to,int _next,int _cap,int _flow)
        {
            to=_to,next=_next,cap=_cap,flow=_flow;
        }
    } edge[MAXM]; //注意是MAXM
    int tol;
    int head[MAXN];
    int gap[MAXN],d[MAXN],pre[MAXN],cur[MAXN];
    void init()
    {
        tol = 0;
        memset(head,-1,sizeof(head));
    }
    void addedge(int u,int v,int w)
    {
        edge[tol]=Edge(v,head[u],w,0);
        head[u]=tol++;
        edge[tol]=Edge(u,head[v],0,0);
        head[v]=tol++;
    }
    int isap(int start,int end,int N)
    {
        memset(gap,0,sizeof(gap));
        memset(d,0,sizeof(d));
        memcpy(cur,head,sizeof(head));
        int u = start;
        pre[u] = -1;
        gap[0] = N;
        int ans = 0;
        while(d[start] < N)
        {
            if(u == end)
            {
                int Min = INF;
                for(int i = pre[u]; i != -1; i = pre[edge[i^1].to])
                    if(Min > edge[i].cap - edge[i].flow)
                        Min = edge[i].cap - edge[i].flow;
                for(int i = pre[u]; i != -1; i = pre[edge[i^1].to])
                {
                    edge[i].flow += Min;
                    edge[i^1].flow -= Min;
                }
                u = start;
                ans += Min;
                continue;
            }
            bool flag = false;
            int v;
            for(int i = cur[u]; i != -1; i = edge[i].next)
            {
                v = edge[i].to;
                if(edge[i].cap - edge[i].flow && d[v]+1 == d[u])
                {
                    flag = true;
                    cur[u] = pre[v] = i;
                    break;
                }
            }
            if(flag)
            {
                u = v;
                continue;
            }
            int Min = N;
            for(int i = head[u]; i != -1; i = edge[i].next)
                if(edge[i].cap - edge[i].flow && d[edge[i].to] < Min)
                {
                    Min = d[edge[i].to];
                    cur[u] = i;
                }
            gap[d[u]]--;
            if(!gap[d[u]])return ans;
            d[u] = Min+1;
            gap[d[u]]++;
            if(u != start) u = edge[pre[u]^1].to;
        }
        return ans;
    }
    
    int main()
    {
        int T;
        read(T);
        while (T--)
        {
            int n,m,s,t;
            read(n),read(m);
            read(s),read(t);
            init();
            for(int i=1; i<=m; i++)
            {
                int x,y,z;
                read(x),read(y),read(z);
                addedge(x,y,z*MO+1);
            }
            int ans=isap(s,t,n);
            printf("%d
    ",ans%MO);
        }
    }

    Dinic写法

    #include <bits/stdc++.h>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define LC(x) (x<<1)
    #define RC(x) ((x<<1)+1)
    #define MID(x,y) ((x+y)>>1)
    #define CLR(arr,val) memset(arr,val,sizeof(arr))
    #define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
    typedef pair<int,int> pii;
    //typedef long long LL;
    
    namespace FastIO
    {
        const static int MX=1e6;
        bool IOerror=0;
        char nc()
        {
            static char buf[MX],*p1=buf+MX,*pend=buf+MX;
            if(p1==pend)
            {
                p1=buf;
                pend=buf+fread(buf,1,MX,stdin);
                if(pend==p1)
                {
                    IOerror=1;
                    return -1;
                }
            }
            return *p1++;
        }
        inline bool blank(char ch)
        {
            return ch==' '||ch=='
    '||ch=='
    '||ch=='	';
        }
        inline int read(int& x)   
        {
            char ch;
            while(blank(ch=nc()));
            if(IOerror) return 0;
            for(x=ch-'0'; (ch=nc())>='0'&&ch<='9'; x=x*10+ch-'0'); //printf("%d===
    ",x);
            return 1;
        }
    }
    using namespace FastIO;
    
    const int N=210;
    const int M=2010;
    struct edge
    {
        int to,nxt;
        int cap;
        edge() {}
        edge(int _to,int _nxt,int _cap): to(_to),nxt(_nxt),cap(_cap) {}
    };
    edge E[M << 1];
    int head[N],tot,d[N];
    
    void init()
    {
        CLR(head,-1);
        tot=0;
    }
    inline void add(int s,int t,int cap)
    {
        E[tot]=edge(t,head[s],cap);
        head[s]=tot++;
        E[tot]=edge(s,head[t],0);
        head[t]=tot++;
    }
    int bfs(int s,int t)
    {
        CLR(d,-1);
        d[s]=0;
        queue<int>Q;
        Q.push(s);
        while(!Q.empty())
        {
            int u=Q.front();
            Q.pop();
            for(int i=head[u]; ~i; i=E[i].nxt)
            {
                int v=E[i].to;
                if(d[v]==-1 && E[i].cap > 0)
                {
                    d[v]=d[u] + 1;
                    if(v==t)    return 1;
                    Q.push(v);
                }
            }
        }
        return ~d[t];
    }
    int dfs(int s,int t,int f)
    {
        if(s==t || !f)
            return f;
        int ret=0;
        for(int i=head[s]; ~i; i=E[i].nxt)
        {
            int v=E[i].to;
            if(d[v]==d[s] + 1 && E[i].cap > 0)
            {
                int df=dfs(v,t,min(f,E[i].cap));
                if(df>0)
                {
                    E[i].cap -=df;
                    E[i ^ 1].cap +=df;
                    ret +=df;
                    f -=df;
                    if(!f)    break;
                }
            }
        }
        if(!ret) d[s]=-1;
        return ret;
    }
    int dinic(int s,int t)
    {
        int ret=0;
        while (bfs(s,t))
            ret+=dfs(s,t,0x3f3f3f3f);
        return ret;
    }
    int main()
    {
        int T;read(T);
        while(T--)
        {
            init();
            int n,m,s,t;
            read(n),read(m);
            read(s),read(t);
            while(m--)
            {
                int u,v,c;
                read(u),read(v),read(c);
                add(u,v,c*1024+1);
            }
            printf("%d
    ",dinic(s,t)%1024);
        }
    }

    =========================================================================================

    9.22更新

    根据刘汝佳的板子,自己改编一下后如下(希望以后可以一直用

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    
    namespace FastIO
    {
        const static int MX=1e6;
        bool IOerror=0;
        char nc()
        {
            static char buf[MX],*p1=buf+MX,*pend=buf+MX;
            if(p1==pend)
            {
                p1=buf;
                pend=buf+fread(buf,1,MX,stdin);
                if(pend==p1)
                {
                    IOerror=1;
                    return -1;
                }
            }
            return *p1++;
        }
        inline bool blank(char ch)
        {
            return ch==' '||ch=='
    '||ch=='
    '||ch=='	';
        }
        inline int read(int& x)   
        {
            char ch;
            while(blank(ch=nc()));
            if(IOerror) return 0;
            for(x=ch-'0'; (ch=nc())>='0'&&ch<='9'; x=x*10+ch-'0'); //printf("%d===
    ",x);
            return 1;
        }
    }
    using namespace FastIO;
    
    const int N=210;
    const int M=2010;
    const int INF=0x3f3f3f3f;
    
    struct Edge
    {
        int to,next;
        int flow,cap;    //根据情况设定变量类型 
        Edge(){}
        Edge(int _to,int _next,int _cap,int _flow)
        {
            to=_to,next=_next,cap=_cap,flow=_flow;
        }
    };
    Edge edge[M<<1];
    int head[N],tot;
    int cur[N];
    int d[N];
    
    void init()
    {
        memset(head,-1,sizeof(head));
        tot=0;
    }
    inline void addedge(int u,int v,int cap)
    {
        edge[tot]=Edge(v,head[u],cap,0);
        head[u]=tot++;
        edge[tot]=Edge(u,head[v],0,0);
        head[v]=tot++;
    }
    int bfs(int s,int t)
    {
        memset(d,-1,sizeof(d));
        queue<int> Q;
        Q.push(s),d[s]=0;
        while(!Q.empty())
        {
            int u=Q.front();Q.pop();
            for(int i=head[u];~i;i=edge[i].next)
            {
                int v=edge[i].to;
                if(d[v]==-1&&edge[i].cap>edge[i].flow)
                {
                    d[v]=d[u]+1;
                    if(v==t) return 1;
                    Q.push(v);
                }
            }
        }
        return ~d[t];
    }
    int dfs(int s,int t,int a)
    {
        if(s==t||a==0) return a;
        int flow=0,df;
    //    for(int& i=cur[s];~i;i=edge[i].next)
        for(int i=head[s];~i;i=edge[i].next)
        {
            int v=edge[i].to;
    //        if(d[v]==d[s]+1 && 
    //            (df=dfs(v,t,min(a,edge[i].cap-edge[i].flow))>0))    //这种写法 hdu6214 TLE 
            if(d[v]==d[s]+1&&edge[i].cap>edge[i].flow
                &&(df=dfs(v,t,min(a,edge[i].cap-edge[i].flow)))>0)
            {
                edge[i].flow+=df;
                edge[i^1].flow-=df;
                flow+=df;
                a-=df;
                if(a==0) break;
            }
        }
        if(flow==0) d[s]=-1;
        return flow;
    }
    int dinic(int s,int t)
    {
        int ret=0;
        while(bfs(s,t))
        {
    //        memcpy(cur,head,sizeof(cur));
            ret+=dfs(s,t,INF);
        }
        return ret;
    }
    
    int main()
    {
        int T;read(T);
        while(T--)
        {
            init();
            int n,m,s,t;
            read(n),read(m);
            read(s),read(t);
            while(m--)
            {
                int u,v,c;
                read(u),read(v),read(c);
                addedge(u,v,c*1024+1);
            }
            printf("%d
    ",dinic(s,t)%1024);
        }
    }
  • 相关阅读:
    HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别
    Collections.synchronizedMap()与ConcurrentHashMap的区别
    hashcode、equals和 ==详解
    Redis使用总结(二、缓存和数据库双写一致性问题)
    解决vue多个路由共用一个页面的问题
    RESTFUL API 安全认证方式
    Spring Bean详细讲解
    关于slf4j log4j log4j2的jar包配合使用的那些事
    slf4j、jcl、jul、log4j1、log4j2、logback大总结[转]
    经过测试,feign只能通过@RequestBody传对象参数
  • 原文地址:https://www.cnblogs.com/Just--Do--It/p/7552559.html
Copyright © 2011-2022 走看看