首页 > 代码库 > 【强连通】强连通模板 Tarjan
【强连通】强连通模板 Tarjan
比起双连通的Tarjan我倒是觉得反而简单多了。思想和双连通分量是同一个模式。
#include <cstdio> #include <cstring> #include <cstdlib> #include <stack> using namespace std; const int N = 1e5; int dfn[N], scc_id[N]; int deep, scc_cnt; stack <int> s; int dfs(int u) { int lowu = dfn[u] = ++deep; s.push(u); for(int i = head[u]; ~i; i = e[i].next) { int v = e[i].v; if(!dfn[v]) { int lowv = dfs(v); lowu = min(lowu, lowv); } else if(!scc_id[v]) {//连到栈中的还未标号的祖先们 lowu = min(lowu, dfn[v]); }//利用当前scc中的点来更新 } if(lowu == dfn[u]) {//只有最先发现的点满足这个条件 scc_cnt++; while(1) { int x = s.top(); s.pop(); scc_id[x] = scc_cnt; if(x == u) break; } } return lowu; } void tarjan() { for(int i = 0; i < n; i++) { dfn[i] = scc_id[i] = 0; } deep = scc_cnt = 0; for(int i = 0; i < n; i++) { if(!dfn[i]) dfs(i); } } int main() { return 0; }
【强连通】强连通模板 Tarjan
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。