一个疑问求解答
查看原帖
一个疑问求解答
696174
chm_qwq楼主2024/8/24 12:30

使用Tarjan算法找割点的时候,一个节点是割点有两种情况:

  1. 非 rootroot 点 uu 有儿子 vv 且 dfnu≥lowvdfn_u ≥ low_v
  2. rootroot 点且有大于等于两个的儿子。

关注第二条,第二条中的儿子指的应当是任意的儿子,不受第一条的限制。

但下面两种 tarjantarjan 在第二条的判定上使用的不同方法,均能成功通过此题。

int root;
int dfn[N],low[N],tim;
bool cut[N];
void tarjan (int p) {
	dfn[p] = low[p] = ++tim;
	int cnt = 0;//cnt infer the number of sons;
	for (int i = head[p];i;i = e[i].next) {
		int np = e[i].to;
		if (!dfn[np]) {
			tarjan(np);
			low[p] = min(low[p],low[np]);
			cnt++;// 这里有变化
			if (low[np] >= dfn[p]) {
				if (p != root) cut[p] = 1;
				if (p == root && cnt > 1) cut[p] = 1;
			}
		}
		else low[p] = min(low[p],dfn[np]);
	}
}
int root;
int dfn[N],low[N],tim;
bool cut[N];
void tarjan (int p) {
	dfn[p] = low[p] = ++tim;
	int cnt = 0;//cnt infer the number of sons;
	for (int i = head[p];i;i = e[i].next) {
		int np = e[i].to;
		if (!dfn[np]) {
			tarjan(np);
			low[p] = min(low[p],low[np]);
			if (low[np] >= dfn[p]) {
           cnt++;// 这里有变化
				if (p != root) cut[p] = 1;
				if (p == root && cnt > 1) cut[p] = 1;
			}
		}
		else low[p] = min(low[p],dfn[np]);
	}
}

提交记录: 1 2

求解答,两种方法有区别吗?还是数据水没测出来?

2024/8/24 12:30
加载中...