您的位置:首页 > 其它

vijos1022(强联通分量模版题)

2016-06-29 07:55 239 查看
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

bool a[500][500]={false},s[500]={false};
int n,low[500]={0},dfn[500]={0},sta[500009]={0},top,ans,id;
void dfs(int u)
{
dfn[u]=low[u]=++id;
sta[++top]=u;
s[u]=true;
for (int i=1;i<=n;i++) if (a[u][i])
{
if (dfn[i]==0)
{
dfs(i);
low[u]=min(low[u],low[i]);
}else if (s[i]==true)low[u]=min(low[u],low[i]);
}
if (low[u]==dfn[u])
{
ans++;
while (sta[top+1]!=u) s[sta[top]]=false,top--;
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x;
while (scanf("%d",&x),x!=0) a[i][x]=true;
}

for (int i=1;i<=n;i++) if (dfn[i]==0) dfs(i);
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: