关于逆天dfs
查看原帖
关于逆天dfs
709447
tx774楼主2023/11/10 10:37

bushi

之前写了这道题

现在写P8867 [NOIP2022] 建造军营 时候从这里搬了 Tarjan 模板:

int dfn[N],low[N],dfncnt;
//dfn dfs序
//low 在树边与返祖边方向上能走到的dfn最小的节点 
void tarjan(int now,int father)
{
	dfn[now]=low[now]=++dfncnt;
	int child=0;
	for(int i=head[now];i;i=e[i].nxt)
	{
		int to=e[i].to;
		if(!dfn[to])//如果当前边为树边 
		{
			/*>>>>>>*/tarjan(to,father),low[now]=min(low[now],low[to]);
			if(low[to]>=dfn[now]&&now!=father) cut_node[now]=true;
			//如果儿子的low值大于等于dfn,则代表其为儿子与其他非子树点相连的唯一途径
			if(now==father) child++;
		}
		else//当前边为返祖边 
			low[now]=min(low[now],dfn[to]);
	}
	if(child>=2&&now==father) cut_node[now]=true;//对根的处理
}

我这里竟然写了:

tarjan(to,now),low[now]=min(low[now],low[to]);

而且离奇的是这样写竟然 AC 了???

搞得我建造军营写了1h都找不到错

请问这两种写法难道不是明显不等价吗?

还是单纯数据过水?

2023/11/10 10:37
加载中...