如何评价加边顺序对 Dinic 效率的极大影响
查看原帖
如何评价加边顺序对 Dinic 效率的极大影响
154520
chen_03楼主2022/5/24 09:49

声明:我写的不是正解,我不认为正解的复杂度有问题。

AC

TLE

这两份代码只有一处不同:

for(int i=m;i>=1;--i){ // 建边部分
	if(!tp[i])continue;
	ins(s,i,1),ins(i+m,t,1);
	if(tp[i]==2)ins(i,fol[i]+n+m+m,1); // 交换这两行,
	if(tp[i]^4)ins(i,bel[i]+m+m,1);    // 后 6 个点全 T
	if(tp[i]^5)ins(bel[i]+n+m+m,i+m,1);
	if(tp[i]==1)ins(fol[i]+m+m,i+m,1);
}

经实测,TLE 代码在第 20 个点的运行时间是 AC 代码的 4 倍左右,具体表现为:

  • 增广次数大大增加,汇点的深度在每一次增广中直线上升;
  • 每次增广增加的流量很小(前几次增广除外)。

虽然我写的不是正解(建的不是一张二分图?),但这也太阴间了。。。

所以,对于没有特殊性质的图,Dinic 的复杂度始终是玄学吧(暴论

不管怎么样,反正我被这个奇怪的现象搞自闭了。。。

2022/5/24 09:49
加载中...