关于Dinic和当前弧优化_(:зゝ∠)_

5 篇文章 0 订阅

嗯……事情是这样的……本蒟蒻的Dinic属于半打版半YY然后直接扔到CodeVS的草地排水上评测……然而万万没想到大家说的CV评测机太666……我胡搞乱搞调了好几个月的bug……竟然…………没有WA没有T直接欢快地A了…………于是…………嗯……以上大概就是背景x 在又一次刷低了bzoj的AC率后_(:зゝ∠)_ 蒟蒻Flaze终于在用Dev手动debug戳了1k+次鼠标后……发现……我的初始化炸掉了【悲伤逆流成河x


嗯 吐槽到此为止……


以下………………

于是就直接从当前弧优化搞起就好了 顺便……等等……再槽一句……CV的评测姬啊,一颗赛艇

int a=-1;
if(a)
    printf("233\n");

其实也是不会输出233的…………


So………………注意…………初始化的时候直接全部初始化成0就好…………不然卡成狗还找不到哪里炸了【哭……

struct t1{
	int to,nxt,liu;
}edge[200057];	int cnt_edge=1;//注意1^1=0 所以比起从零开始记录 干脆舍弃0,1两个空间从二开始记好了……减少代码复杂度233333

main()里的初始化↓
memset(fst,0,sizeof(fst));
memset(edge,0,sizeof(edge));




嗯…………于是直接上板好了……其实已经被修改的和模板差不多了2333

int dfs(int now,int low){
	if(now==T)	return low;
	int rst=low;
	for(int &tmp=cur[now];tmp;tmp=edge[tmp].nxt){
		if(edge[tmp].liu<=0||dis[edge[tmp].to]!=(dis[now]+1))	continue;
		int tt;
		if(tt=dfs(edge[tmp].to,min(rst,edge[tmp].liu))){
			edge[tmp].liu-=tt;
			edge[tmp^1].liu+=tt;
			rst-=tt;
			if(!rst)	return  low;
		}
	}
	if(rst==low)	dis[now]=-1;
	return low-rst;
}

bool bfs(){
	memset(dis,-1,sizeof(dis));
	dis[0]=qu[0]=0;
	head=0,tail=1;
	int x;
	while(head^tail){
		x=qu[head++];
		for(int tmp=fst[x];tmp;tmp=edge[tmp].nxt){
			if(edge[tmp].liu<=0||~dis[edge[tmp].to])	continue;
			qu[tail++]=edge[tmp].to;
			dis[edge[tmp].to]=dis[x]+1;
		}
	}
	return ~dis[T];
}

void dinic(){
	while(bfs()){
		for(int i=S;i<=T;++i)	cur[i]=fst[i];
		ans+=dfs(S,1000000000);
	}
}


大概……之后再多码几次……dfs以前的写法……是这样的↓【大概要慢一些……需要多调用几次dfs 可能被卡常【毕竟有lxl大神这种热爱卡常的菊苣存在【哭唧唧x

int dfs(int now,int low){
	if(now==T)	return low;
	for(int &tmp=cur[now];tmp;tmp=edge[tmp].nxt){
		if(edge[tmp].liu<=0||dis[edge[tmp].to]!=(dis[now]+1))	continue;
		int tt;
		if(tt=dfs(edge[tmp].to,min(low,edge[tmp].liu))){
			edge[tmp].liu-=tt;
			edge[tmp^1].liu+=tt;
			return tt;
		}
	}
	return 0;
}
然后dinic内部相当于是两个while循环

void dinic(){
	while(bfs()){
		for(int i=S;i<=T;++i)	cur[i]=fst[i];
		int tt;
		while(tt=dfs(S,1000000000))ans+=tt;
	}
}

但是第二种……大概代码复杂度可以减弱x

顺便附两种写法【虽然差不多】在CV上做切糕的时间对比↓【不要在意代码长度 我写的一向比较丑2333

1.

2.

顺便……毕竟是CV的评测机……跑多快都不要在意23333


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值