#include<stdio.h>
#include<string.h>
#include<stack>
#include<vector>
#include<iostream>
#include<iomanip>
using namespace std;
stack<int> a;
vector<int> g[100];
bool instack[100];
int dfn[100],low[100],time;
void tarjan(int v)
{
dfn[v]=low[v]=++time;
a.push(v),instack[v]=true;
for(int i=0;i<g[v].size();i++)
if(!dfn[g[v][i]])
{
tarjan(g[v][i]);
low[v]=min(low[v],low[g[v][i]]);
}
else if(instack[g[v][i]]) low[v]=min(low[v],low[g[v][i]]);
if(dfn[v]==low[v])
{
while(a.top()!=v)
{
cout<<a.top()<<" ";
instack[a.top()]=false;
a.pop();
}
cout<<a.top()<<endl<<endl;
a.pop();
}
}
int main()
{
int n,m,x,y,i;
cin>>n>>m;
while(m--)
{
scanf("%d%d",&x,&y);
g[x].push_back(y);
}
memset(dfn,0,sizeof(dfn));
memset(instack,false,sizeof(instack));
while(!a.empty()) a.pop();
time=0;
for(i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
}
强连通分量——tarjan
最新推荐文章于 2022-08-04 09:40:20 发布