zoukankan      html  css  js  c++  java
  • hdu 6214 割边最少的最小割

    题意:求割边最少的最小割

    思路:流量*mod + 1,最小割等于 maxflow/mod   割边数量等于maxflow%mod

    ps.注意mod要取的足够大

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int n,m;
    const int maxn=1e5+10;
    const int maxm=1e5+10;
    const long long inf = 1e18;
    const int mod=133331;
    int level[maxn],que[maxn];
    int head[maxn],tot;
    struct edge{
        int next,to;
        long long c;
    }e[maxm];
    
    void edgemake(int from,int to,long long c){
        e[++tot].c=c;
        e[tot].to=to;
        e[tot].next=head[from];
        head[from]=tot;
    }
    void make(int from,int to,long long c){
        edgemake(from,to,c);
        edgemake(to,from,0);
    }
    
    bool bfs(int s,int t){
        memset(level,0,sizeof(level));
        int zfr=1,zend=0;
        que[++zend]=s;
        level[s]=1;
        while(zfr<=zend){
            int u=que[zfr++];
            if(u==t) return true;
            for(int k=head[u];k!=-1;k=e[k].next){
                int v=e[k].to;
                if(!level[v]&&e[k].c){
                    que[++zend]=v;
                    level[v]=level[u]+1;
                }
            }
        }
        return false;
    }
    
    long long dfs(int now,int t,long long maxf){
        if(now==t||maxf==0) return maxf;
        long long ret=0;
        for(int k=head[now];k!=-1;k=e[k].next){
            int u=e[k].to;
            if(level[u]==level[now]+1&&e[k].c){
                long long f=dfs(u,t,min(e[k].c,maxf-ret));
                e[k].c-=f;
                e[k^1].c+=f;
                ret+=f;
                if(ret==maxf) return ret;
            }
        }
        if(ret==0) level[now]=0;
        return ret;
    }
    
    long long maxflow(int s,int t){
        long long ret=0;
        while(bfs(s,t)){
            ret+=dfs(s,t,inf);
        }
        return ret;
    }
    
    void edgeini(){
        memset(head,-1,sizeof(head));
        tot=-1;
    }
    
    int main(){
        int tt;
        scanf("%d",&tt);
        while(tt--){
            edgeini();
            int s,t,u,v,flag;
            long long w;
            scanf("%d%d%d%d",&n,&m,&s,&t);
            for(int i=1;i<=m;i++){
                scanf("%d%d%lld",&u,&v,&w);
                make(u-1,v-1,w*mod+1);
            }
            printf("%lld
    ",maxflow(s-1,t-1)%mod);
        }
    }


  • 相关阅读:
    String
    Map和Set
    js的栈与堆
    js的私有属性
    随便谈一谈原型
    前端页面优化提速
    nth-child和nth-of-type
    重复输出字符串
    闭包
    mongodb内嵌文档的查询
  • 原文地址:https://www.cnblogs.com/zhangxianlong/p/10672482.html
Copyright © 2011-2022 走看看