200字
「模板」Tarjan求强连通分量
2025-11-18
2025-11-18
#include <bits/stdc++.h>
using namespace std;
int dfn[1145],low[1145],dfncnt,st[1145],tp;
bool vis[1145];
vector<int> mp[1145];
void tarjan(int p) {
	low[p]=dfn[p]=++dfncnt;
	st[++tp]=p;//栈
	vis[p]=1;
	int sz=mp[p].size();
	for(int i=0;i<sz;i++)
		if(dfn[mp[p][i]]==0) {//如果子节点没访问过 
			tarjan(mp[p][i]);//推下去 
			low[p] = min(low[mp[p][i]],low[p]);//更新 
		}
		else if(vis[mp[p][i]])//可能出现回溯的边 
			low[p]=min(low[p],low[mp[p][i]]);
	if(dfn[p]==low[p])//如果自己更新不到更前面的节点,那扫一遍以自己为起点有没有强连通 
		while(low[st[tp]]==low[p])//出栈
			tp--;//点懒得存了,可以存到表示强连通分量的数组里 
}
int main()
{
	/*
	输入邻接表 
	*/
	tarjan(1);
	return 0;
} 

懒。