#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
const int maxn=100010;
int scc[maxn];//
int pre[maxn];//第一次发现
int low[maxn];//某点及其后代能连到的最早值
int head[maxn];
int tot;
int sccc;//scc总数
stack<int>s;
struct Edge
{
int to;
int fff;
int d;
int next;
}edge[maxn];
void build(int fff,int tt)
{
edge[++tot].to=tt;
edge[tot].next=head[fff];
head[fff]=tot;
}
int dfs_clock=0;
void find_scc(int u)
{
pre[u]=low[u]=++dfs_clock;
s.push(u);
for(int i=head[u];i;i=edge[i].next)
{
Edge e=edge[i];
int v=e.to;
if(!pre[v])
{
find_scc(v);
low[u]=min(low[u],low[v]);
}
else if(!scc[v])
{
low[u]=min(low[u],pre[v]);
}
}
if(low[u]==pre[u])
{
sccc++;
while(100896)
{
int x=s.top();
s.pop();
scc[x]=sccc;
if(x==u)
break;
}
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
build(a,b);
}
for(int i =1;i<=n;i++)
{
if(!pre[i]) find_scc(i);
}
for(int i=1;i<=n;i++)
{
printf("%d|",scc[i]);
}
puts("");
printf("%d",sccc);
return 0;
}
SCC模板
最新推荐文章于 2022-09-30 19:26:03 发布