mnzn疑惑为何tarjan函数不需要记录上一个被访问的节点 这样是对的
void tarjan(int p,int la){
dfn[p]=++tot;
low[p]=tot;
int flag=0;
for(int i=0;i<q[p].size();i++){
int v=q[p][i];
if(v==la){
continue;
}
if(!dfn[v]){
tarjan(v,p);
low[p]=min(low[v],low[p]);
if(low[v]>=dfn[p]){
flag++;
if(flag>1||p!=rt){
if(!cut[p])son++;
cut[p]=1;
}
}
}
else{
low[p]=min(dfn[v],low[p]);
}
}
}
但是这样也是对的
void tarjan(int p){
dfn[p]=++tot;
low[p]=tot;
int flag=0;
for(int i=0;i<q[p].size();i++){
int v=q[p][i];
//if(v==la)continue;
if(!dfn[v]){
tarjan(v);
low[p]=min(low[v],low[p]);
if(low[v]>=dfn[p]){
flag++;
if(flag>1||p!=rt){
if(!cut[p])son++;
cut[p]=1;
}
}
/*
if(flag==1&&p!=rt){
cut[p]=1;
}
if(flag>1){
cut[p]=1;
}
*/
}
else{
//dfn[la]<low[p] low[p]会被更新
low[p]=min(dfn[v],low[p]);
}
}
}
做法2不会导致low[p]错误的被上一个访问的节点错误更新变小吗?