【网络流】【更新模板】dinic多路增广+当前弧

加入当前弧优化

#define INF (1<<30)
#define N 101000
#define M 200010
#pragma comment(linker, "/STACK:32000000")
int n,m,s,t;	int head[N],cur[N],cnt;
struct edge{    int v,w,next;	}e[M];
int q[N],dis[N],start,end;
void addedge(int u,int v,int w)
{	e[cnt]=(edge){v,w,head[u]}; head[u]=cnt++;
	e[cnt]=(edge){u,0,head[v]}; head[v]=cnt++;
}
int bfs()
{
    memset(dis,-1,sizeof(dis));    start=end=0; q[0]=t; dis[t]=0;
    while (start<=end)
    {
        int u=q[start++];
        for(int i=head[u];i!=-1;i=e[i].next)
        if(dis[e[i].v]==-1 && e[i^1].w>0){  dis[e[i].v]=dis[u]+1; q[++end]=e[i].v;  }
    }
    return dis[s]!=-1;
}
int dfs(int u,int t,int flow)
{
    if(u==t) return flow;    int delta=flow;
    for(int &i=cur[u];i!=-1;i=e[i].next)
        if(dis[u]==dis[e[i].v]+1 && e[i].w>0)
        {
            int d=dfs(e[i].v,t,min(delta,e[i].w));
            e[i].w-=d;    e[i^1].w+=d;   delta-=d;
            if(delta==0) break;
        }
    return flow-delta;
}
int ans0=0;
while (bfs()){	for(int i=1;i<=n;i++) cur[i]=head[i];		ans0+=dfs(s,t,INF);		}

速度很奇怪,POJ3469要4000+比之前写的预流推进还慢,但是HDU4280可以刷3000+的速度。因为是递归所以要注意爆栈。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值