#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
vector <int> q[1000];
int color[10000],c=0,num=0,low[1000],dfn[1000],top=0,f[1000],s[1000],maxf=-1;
void dfs(int x)
{
dfn[x]=++num;
low[x]=num;
f[x]=1;
s[++top]=x;
for(int i=0;i<q[x].size();i++)
{
int tmp=q[x][i];
if(dfn[tmp]==0)
{
dfs(tmp);
low[x]=min(low[x],low[tmp]);
}
else
if(f[tmp]==1)
{
low[x]=min(low[x],dfn[tmp]);
}
}
if(low[x]==dfn[x])
{
f[x]=0;
color[x]=++c;
while(s[top]!=x)
{
color[s[top]]=c;
f[s[top]]=0;
top--
}
top--;
}
}
int main()
{
int n,m;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
while(1)
{
int k;
scanf("%d",&k);
if(k==0) break;
q[i].push_back(k);
}
}
for(int i=1;i<=n;i++)
if(!dfn[i]) dfs(i);
printf("%d\n",c);
/*for(int i=1;i<=c;i++)
{
for(int j=1;j<=n;j++)
{
if(color[j]==i) printf("%d ",j);
}
puts("");
}*/
return 0;
}
裸的tarjan(模板)
最新推荐文章于 2020-03-15 19:36:56 发布