强连通分量
首先简单介绍一下强连通分量的概念,简单点说就是一个有向图里面,强连通分量里面任意两个点之间的可以互相抵达,则这些点和边组成的子图是一个强连通分量。
tarjan算法
在递归站中的low值相等的点是一个强联通分量
dfn值和low值相等的是该分量的代表点
代码:
void tarjan(int u) {
dfs[u] = low[u] = ++num;
stack[++top] = u;
ins[u] = 1;
for(int i = head[u]; i; i = edge[u].nxt) {
int v = edge[i].v;
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u],low[v]);
} else {
if (ins[v]) {
low[u] = min(low[u],dfn[v]);
}
}
}
if (dfs[u] == low[u]) {
cnt++;
int v;
do {
v = stack[top--];
ins[v] = 0;
c[v] = cnt;
scc[cnt].push_back(v);
}while (u != v);
}
}