强连通分量
tarjan
%%%
具体算法解析:
首先 我们需要知道 what is 强连通分量
那么tarjan发明的tarjan算法能做什么呢
-
找出强连通分量
-
缩点
将图中的所有强连通分量缩点后
原本一个非常复杂的乱七八糟的图就会变成一个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();
}
}
具体代码解析请参考强连通分量
练习题: