使用Tarjan算法找割点的时候,一个节点是割点有两种情况:
关注第二条,第二条中的儿子指的应当是任意的儿子,不受第一条的限制。
但下面两种 tarjan 在第二条的判定上使用的不同方法,均能成功通过此题。
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]);
}
}
求解答,两种方法有区别吗?还是数据水没测出来?