Tarjan板
作者:
JingNian
,
2022-08-02 14:17:30
,
所有人可见
,
阅读 136
int dfn[maxn] = { 0 }, low[maxn] = { 0 }, idfs = 0;
int sk[maxn] = { 0 }, issk[maxn] = { 0 }, isk = 0;
int scc[maxn] = { 0 }, sz[maxn] = { 0 }, iscc = 0;
int n, m;
vector<int> G[maxn];
vector<int> TG[maxn];
void tarjan(int u) {
dfn[u] = low[u] = ++ idfs;
sk[++ isk] = u;
issk[u] = 1;
for(auto ne : G[u]) {
if(!dfn[ne]) {
tarjan(ne);
chmin(low[u], low[ne]);
}else if(issk[ne]) {
chmin(low[u], low[ne]);
}
}
if(dfn[u] == low[u]) {
++ iscc;
while(sk[isk] != u) {
scc[sk[isk]] = iscc;
sz[iscc] ++;
issk[sk[isk]] = 0;
isk --;
}
scc[sk[isk]] = iscc;
sz[iscc] ++;
issk[sk[isk]] = 0;
isk --;
}
}
void get_TG() {
for(int i = 1; i <= n; i ++ ) {
if(!dfn[i]) {
tarjan(i);
}
}
set<pii> seg;
for(int i = 1; i <= n; i ++ ) {
if(G[i].size()) {
for(auto ne : G[i]) {
if(scc[i] != scc[ne]) {
seg.insert({scc[i], scc[ne]});
}
}
}
}
for(auto p : seg) {
TG[p.fi].pb(p.se);
}
}