原题链接传送门
做法
两个
d
f
s
dfs
dfs
第一个
d
f
s
dfs
dfs
用来记录出栈的顺序
第
二
个
d
f
s
加
一
个
f
o
r
第二个~ dfs~加 一个~for
第二个 dfs 加一个 for
求有多少个强连通分量。
代码
#include<iostream>
using namespace std;
int a[1110][1110],v[1110],f[1110];
int n,q,t,ans;
void dfs(int x)
{
v[x]=1;
for(int i=1; i<=n; i++)
if(!v[i]&&a[x][i]>0)
dfs(i);
f[++t]=x;
}
void dfs2(int x)
{
v[x]=1;
for(int i=1;i<=n;i++)
if(!v[i]&&a[x][i]>0)
dfs2(i);
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>q;
while(q!=0)
{
a[i][q]=1;
cin>>q;
}
}
for(int i=1; i<=n; i++)
if(v[i]==0)
dfs(i);
memset(v,0,sizeof(v));
for(int i=n; i>=1; i--)
{
if(v[f[i]]==0)
{
ans++;
dfs2(f[i]);
}
}
cout<<ans;
return 0;
}