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;
}
#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;
}
相关文章推荐
- C#基础一
- PHP几个防SQL注入攻击自带函数区别
- WPF中的binding(九)- 使用Binding的RelativeSource
- osgi + felix example2b编写
- profile
- 【直视骄阳】遗愿清单
- Java面向对象概念
- 关于promise
- C#中一些常用的加密和哈希处理
- Nodejs监控文件内容变化并获取最新添加的内容
- Xcode各版本官方下载及百度云盘下载, Mac和IOS及Xcode版本历史.
- linux虚拟机网络不通,重启后还是不行
- 【Maven】快速走进Maven的世界
- c++运算符的重载
- Codeforces 163A Substring and Subsequence
- android 加载网络数据(1)
- 事务的简单应用
- qemu 跑内核和文件系统
- C++中32位单精度浮点数有效数字是多少位?
- 第三方支付接口对接基本流程