图论算法之强连通分量

强连通分量

tarjan

%%%

具体算法解析:

首先 我们需要知道 what is 强连通分量

那么tarjan发明的tarjan算法能做什么呢

  1. 找出强连通分量

  2. 缩点

将图中的所有强连通分量缩点后

原本一个非常复杂的乱七八糟的图就会变成一个DAG(有向无环图)

太棒了!!

那又有什么用呢

这样能大大提升你遍历图的效率,同时也能帮你解决关于环的麻烦

tajan核心代码:

void tarjan(int num){
	dfn[num]=low[num]=++dfsnum;
	vis[num]=1;
	s.push(num);
	for(int i=head[num];i!=-1;i=e[i].nxt){
		int tmp=e[i].to;
		if(!dfn[tmp]){
			tarjan(tmp);
			low[num]=min(low[num],low[tmp]);
		}
		else if(vis[tmp])
			low[num]=min(low[num],low[tmp]);
	}
	if(dfn[num]==low[num]){
		sum++;
		while(s.top()!=num){
			int k=s.top();
			f[k]=sum;
			vis[k]=0;
			s.pop();
		}
		int k=s.top();
		f[k]=sum;
		vis[k]=0;
		s.pop();
	}
}

具体代码解析请参考强连通分量

练习题:

图的遍历

间谍网络

受欢迎的牛

发布了28 篇原创文章 · 获赞 8 · 访问量 611

猜你喜欢

转载自blog.csdn.net/zty_ju/article/details/95675353
今日推荐