#include <stdio.h>
#include <stack>
#include <cstring>
#include <stdlib.h>
#define maxN 600010
using namespace std;
stack <int> sta;
struct Tnode{
int nxt,v;
}edge[maxN];
int first[maxN];
int dfn[maxN],low[maxN],vis[maxN],instack[maxN],f[maxN],chu[maxN],ru[maxN];
int tot,k,cnt;
int n,m;
int ans;
void init()
{
memset(first,-1,sizeof first);
memset(dfn,-1,sizeof dfn);
memset(f,0,sizeof f);
ans=tot=k=cnt=0;
}
void add(int u,int v)
{
edge[++tot].v=v,edge[tot].nxt=first[u];
first[u]=tot;
}
void tarjan(int v)
{
dfn[v]=low[v]=++k;
instack[v]=1;
sta.push(v);
for (int i=first[v]; i!=-1; i=edge[i].nxt)
{
int u=edge[i].v;
if (dfn[u]==-1)
{
tarjan(u);
low[v]=min(low[v],low[u]);
}else
if (instack[u]) low[v]=min(low[v],dfn[u]);
}
if (dfn[v]==low[v])
{
cnt++;
while (!sta.empty())
{
int u=sta.top();
sta.pop();
vis[u]=cnt;
instack[u]=0;
if (u==v) break;
}
}
}
int main()
{
freopen("强连通分量.in","r",stdin);
freopen("强连通分量.out","w",stdout);
scanf("%d%d",&n,&m);
init();
for (int i=1; i<=m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
}
for (int i=1; i<=n; i++) if (dfn[i]==-1) tarjan(i);
return 0;
}
强连通分量
最新推荐文章于 2023-08-26 15:03:55 发布