tarjan——有向图、无向图

强连通块只存在于有向无环图DAG中

实际上low[i]的理解是:一个强连通块在dfs搜索树中子树的根节点

//把一个点当成根提溜出来,抖搂抖搂成一棵树 
void dfs(int u)
{
//记录dfs序
//可通过任意多dfs边与最多一条非树返祖边到达的、本强连通分量内最小点 
	dfn[u]=low[u]=++dfs_clock;
	s.push(u);
	for(int v:g[u])
	{
		if(!dfn[v])//树边 
		{
			dfs(v);
			low[u]=min(low[u],low[v]);
		}
		else if(!sccnum[v])//返祖 
			low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u])
	{
		scccnt++;//强连通块+1 
		while(1)
		{
			int x=s.top();
			s.pop();
			sccnum[x]=scccnt;
			sccsz[scccnt]++;
			if(x==u) break;
		}
	}
}//有向图 

对于无向图来说,应处理的是割点和桥

posted @ 2022-02-11 15:10  fervency  阅读(43)  评论(0编辑  收藏  举报