Tarjan 算法求强连通分量 学习笔记
前言
何为强连通分量?
在一个有向图中,若这个图的子图中,任意两点间可以相互到达,那么这个子图就叫做强连通分量。
Tarjan 算法求强连通分量
模板题:Luogu P2863 [USACO06JAN] The Cow Prom S
思想
Tarjan算法过程:
以下图为例做演示。
我们定义两个数组
含义:
DFS
搜索时,被访问的时间点(时间戳)。
我们再创建一个栈
DFS
原则,先访问,后操作。
我们从一号节点开始,现将
q.push(1)
,vis_1=1
,dfn_1=low_1=1
。
s
:(栈顶)1
(栈底)。
根据 DFS
访问顺序,再将
q.push(2)
,vis_2=1
,dfn_2=low_2=2
。
s
:(栈顶)2 1
(栈底)。
访问
q.push(3)
,vis_3=1
,dfn_3=low_3=3
。
s
:(栈顶)3 2 1
(栈底)。
访问
q.push(4)
,vis_4=1
,dfn_4=low_4=4
。
s
:(栈顶)4 3 2 1
(栈底)。
此时整个图已经访问完毕了,然后从栈顶开始更新
先看
发现 low_4=low_2=2
。
再看
发现 low_3=low_2=2
。
然后来看
同样地,
重复操作,直至所有点都被更新完毕。
Code
定义
Code:
#include <bits/stdc++.h>
#define ll long long
const int N = 1e4 + 5,M = 5e4 + 5;
using namespace std;
inline int read(){
int r = 0,w = 1;
char c = getchar();
while (c < '0' || c > '9'){
if (c == '-'){
w = -1;
}
c = getchar();
}
while (c >= '0' && c <= '9'){
r = (r << 3) + (r << 1) + (c ^ 48);
c = getchar();
}
return r * w;
}
int n,m;
struct edge{
int nxt,to;
}e[M];
int head[N],cnt = 0;;
void edge_add(int x,int y){
cnt++;
e[cnt].nxt = head[x];
head[x] = cnt;
e[cnt].to = y;
}
namespace tj{
int tot = 0,dfn[N],low[N],fa[N],sum[N];
bool vis[N];
stack<int> s;
void tarjan(int x){
tot++;
dfn[x] = low[x] = tot;
vis[x] = 1;
s.push(x);
for (int i = head[x];i;i = e[i].nxt){
int v = e[i].to;
if (!dfn[v]){
tarjan(v);
low[x] = min(low[x],low[v]);
}
else if (vis[v]){
low[x] = min(low[x],dfn[v]);
}
}
if (low[x] == dfn[x]){
int pre;
do {
pre = s.top();
s.pop();
fa[pre] = x;
vis[pre] = 0;
sum[x]++;
}while (pre != x);
}
}
}
using namespace tj;
int main(){
n = read(),m = read();
for (int i = 1;i <= m;i++){
int x = read(),y = read();
edge_add(x,y);
}
for (int i = 1;i <= n;i++){
if (!dfn[i]){
tarjan(i);
}
}
int ans = 0;
for (int i = 1;i <= n;i++){
if (fa[i] == i && sum[i] > 1){
ans++;
}
}
printf("%d",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】