强连通:有向图两个点互相可以到达,则称为强连通,强连通分量指将图分成多个子图,每个子图的点都能相互到达,子图就称为强连通分量;
const int N = 1e5 + 5; vector<int>e[N]; int dfn[N]//dfs顺序 , low[N]//往前跳能到达的最小数 , dex, bel[N]//表示每一个点在哪一个强连通分量中 , cnt; bool ins[N];//表示是否在栈中 stack<int>s; vector<vector<int>>scc; void tarjan(int u) { dfn[u] = low[u] = ++dex; ins[u] = true; s.emplace(u); for (int v : e[u]) { if (!dfn[v]) tarjan(v); if(ins[v]) low[u] = min(low[u], low[v]); } if (dfn[u] == low[u])//已经不能往回了 { vector<int>c; ++cnt;//连通分量的组数 while (true) { int v = s.top(); c.emplace_back(v); ins[v] = false; bel[v] = cnt; s.pop(); if (v == u) break; } sort(c.begin(), c.end()); scc.emplace_back(c); } } int mian() { int n, m; cin >> n >> m; for (int i = 0; i < m; ++i) { int u, v; cin >> u >> v; e[u].emplace_back(v); } for (int i = 1; i <= n; ++i) { if (!dfn[i]) { tarjan(i); } } sort(scc.begin(), scc.end()); for (auto c : scc) { for (int u : c) { cout << u << ' '; } cout << endl; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具