zoukankan      html  css  js  c++  java
  • hdu 4280比较裸的dinic算法

    算法比较裸,不过要注意在hdu上递归层次多了是要暴栈的,所以看了别人的知道了外挂开栈这个东西避免暴栈,真心好用!

    #include"stdio.h"
    #include"string.h"
    #pragma comment(linker, "/STACK:1024000000,1024000000")//外挂开栈
    #define inf 99999999
    
    int min(int a,int b)
    {
        return a<b?a:b;
    }
    
    int e,head[100005];
    int level[100005];
    int q[100005];
    
    struct node
    {
        int to,val;
        int next;
    }edge[200005];
    
    void add_edge(int x,int y,int w)
    {
        edge[e].to=y;
        edge[e].val=w;
        edge[e].next=head[x];
        head[x]=e++;
    
        edge[e].to=x;
        edge[e].val=w;
        edge[e].next=head[y];
        head[y]=e++;
    }
    
    bool bfs(int s,int t)
    {
        int front=0,rear=0;
        int top,k;
        q[rear++]=s;
        memset(level,0,sizeof(level));
        level[s]=1;
        while(front<rear)
        {
            top=q[front++];
            if(top==t)
                return true;
            for(k=head[top];k!=-1;k=edge[k].next)
            {
                if(!level[edge[k].to]&&edge[k].val>0)
                {
                    level[edge[k].to]=level[top]+1;
                    q[rear++]=edge[k].to;
                }
            }
        }
        return false;
    }
    
    int dfs(int now,int maxf,int t)
    {
        int ret=0,f,k;
        if(now==t)
            return maxf;
        for(k=head[now];k!=-1;k=edge[k].next)
        {
            if(level[edge[k].to]==level[now]+1&&edge[k].val>0)
            {
                f=dfs(edge[k].to,min(maxf-ret,edge[k].val),t);
                edge[k].val-=f;
                edge[k^1].val+=f;
                ret+=f;
                if(ret==maxf)
                    return ret;
            }
        }
        if(ret==0)
            level[now]=0;
        return ret;
    }
    
    int dinic(int s,int t)
    {
        int ans=0;
        while(bfs(s,t))
            ans+=dfs(s,inf,t);
        return ans;
    }
    
    int main( )
    {
        int T,i,n,m,s,t;
        int x,y,w,ps,pt;
        scanf("%d",&T);
        while(T--)
        {
            e=0;s=inf;t=0;
            memset(head,-1,sizeof(head));
            scanf("%d%d",&n,&m);
            for(i=1;i<=n;i++)
            {
                scanf("%d%d",&x,&y);
                if(s>x)
                {s=x;ps=i;}
                if(t<x)
                {t=x;pt=i;}
            }            
            for(i=1;i<=m;i++)
            {
                scanf("%d%d%d",&x,&y,&w);
                add_edge(x,y,w);
            }
            printf("%d\n",dinic(ps,pt));
        }
        return 0;
    }
  • 相关阅读:
    Action返回类型
    低成本FPGA中实现动态相位调整
    SERDES高速系统(二)
    SERDES高速系统(一)
    Avalon总线概述
    FPGA热设计
    功耗的挑战
    特性阻抗介绍
    低阻抗电源分配系统
    非理想回路信号衰减
  • 原文地址:https://www.cnblogs.com/chaosheng/p/2702061.html
Copyright © 2011-2022 走看看