//Tarjan
#include<bits/stdc++.h>
using namespace std;
int low[N],num[N],dfn;
int sccno[N],stack[N],top;
vector <int> G[N];
void dfs(int u)
{
stack[top++]=u;
low[u]=num[u]=++dfn;
for(int i=0;i<G[u].size();++i){
int v=G[u][i];
if(!num[v])
{
dfs(v);
low[u]=min(low[v],low[u]);
}
else if(!sccno[v])
low[u]=min(low[u],num[u]);
}
if(low[u]==num[u]){
cnt++;
while(1){
int v=stack[--top];
sccno[v]=cnt;
if(u==v) break;
}
}
}
void Tarjan(int n)
{
cnt=top=dfn=0;
memset(sccno,0,sizeof(sccno));
memset(num,0,sizeof(num));
memset(low,0,sizeof(low));
for(int i=1;i<=n;i++)
if(!num[i])
dfs[i];
}
Tarjan
最新推荐文章于 2023-07-02 10:42:44 发布