警示后人
查看原帖
警示后人
390742
qwqUwU楼主2023/2/13 23:18

本道题共 44 个数据点,其中数据点 1,2,31,2,3 存在一定程度的卡常(也可能是图决定 dinic 复杂度较高)。

因此,如果你的前三个点 TLE,请确保你的 Dinic 中 dfs 部分存在一定程度的剪枝优化。

包括但不限于:

int dfs(int u,int in,int s,int t){
	if(u==t)return in;
	int out=0;
	for(int i=head[u];i;i=edge[i].nxt){
		if(edge[i].flow==0)continue;
		int v=edge[i].to;
		if(dis[v]==dis[u]+1){
			int k=dfs(v,min(in,edge[i].flow),s,t);
			in-=k;
			out+=k;
			edge[i].flow-=k;
			edge[i^1].flow+=k;
			if(in==0)break;//这一句
		}
	}
	if(out==0)dis[u]=0;
	return out;
}

这种方法能有 454\sim 5 倍的速度优化,足以通过此题。

此外,还可以通过在到达 vv 后如果没有流就关掉这个点(深度变为 00 的方法(虽然效率远不及第一个方法)。

同时,我不建议加入当前弧优化,因为在写不好时这是个负优化(这点存疑,可能是我写挂了)。

2023/2/13 23:18
加载中...