P3387 【模板】缩点
为什么要用栈?
void dfs(int p) {
dfn[p] = ++cnt;
low[p] = dfn[p];
st[++top] = p;
in[p] = 1;
for(auto to : G[p]) {
if(!dfn[to]) {
dfs(to);
low[p] = min(low[p], low[to]);
} else if(in[to]) {
low[p] = min(low[p], dfn[to]);
}
}
if(dfn[p] == low[p]) {
in[p] = 0;
scc[p] = ++SCC;
q[SCC] = a[p];
while(st[top] != p) {
int u = st[top--];
q[SCC] += a[u];
scc[u] = SCC;
in[u] = 0;
}
--top;
}
}