#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;
} 懒。