tarjan模板
#include<bits/stdc++.h>
using namespace std;
int m,n,a,b,size=0,sign=0,top=0,id[100001];
int first[10001],next[10001],c[10001],v[10001];
int low[10001],dfn[10001],sta[10001],sum;
bool insta[10001];
void inser(int x,int y)
{
size++;
next[size]=first[x];
first[x]=size;
v[size]=y;
}
void dfss(int x)
{
int k,i;
sign++;
low[x]=sign;
dfn[x]=sign;
top++;
sta[top]=x;
insta[x]=true;
k=first[x];
while(k!=0)
{
i=v[k];
if(dfn[i]==0)
{
dfss(i);
if(low[i]<low[x]) low[x]=low[i];
}
else
{
if((insta[i])&&(dfn[i]<low[x]))
{
low[x]=dfn[i];
}
}
k=next[k];
}
if(low[x]==dfn[x])
{
sum++;
i=sta[top];
while(i!=x)
{
id[i]=sum;
insta[i]=false;
top--;
i=sta[top];
}
top--;
id[x]=sum;
insta[x]=false;
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>a>>b;
inser(a,b);
inser(b,a);
}
for(int i=1;i<=n;i++)
{
if(dfn[i]==0)dfss(i);
}
cout<<sum<<endl;
for(int i=1;i<=n;i++)
{
cout<<i<<"属于第"<<id[i]<<"个强连通分量"<<endl;
}
}