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;
}
原文地址:https://www.cnblogs.com/chaosheng/p/2702061.html