对tarjan算法的疑问
查看原帖
对tarjan算法的疑问
389729
BantM楼主2024/10/25 16:25

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]错误的被上一个访问的节点错误更新变小吗?

2024/10/25 16:25
加载中...