1. 图论
1.1 求强力连通分量——Tarjan算法
Tarjan算法时用来求强连通分量的,它基于一种DFS的算法,每个强连通分量为搜索树的一颗子树
void tarjan(int k){
low[k] = dfn[k] = ++t;
f[k] = true; // f[]代表该结点已经入栈
s.push(k);
for(int i=fst[k];i!=-1;i=nex[i]){
if(!dfn[v[i]]){
tarjan(v[i]);
low[k] = min(low[k],low[v[i]]);
}
else{
if(f[v[i]])
low[k] = min(low[k], dfn[v[i]]);
}
}
if(low[k]==dfn[k]){
f[k] = false;
scc[k] = ++cnt; // cnt记录强连通分量个数,ssc表示k在第cnt个强连通分中
ssize[cnt] = 1; // ssize记录第cnt个强连通分量的成员数
while(s.top()!=k){
scc[s.top()] = cnt;
f[s.top()] = false;
ssize[cnt]++;
s.pop();
}
s.pop();
}
return;
}
Reference