#include<bits/stdc++.h>
using namespace std;
int now,y,n,m;
const int maxn=1e3+5;
struct node{
int num,v;
}a[1005];
vector<int>u[1005];
int dfn[maxn],low[maxn],stacK[maxn*3],tim=0,top=0;
bool vis[maxn];
void tarjan(int now){
dfn[now]=low[now]=++tim;
stacK[++top]=now;
vis[now]=true;
for(int i=0;i<u[now].size();i++){
int next=u[now][i];
if(!dfn[next]){//this
tarjan(next);
low[now]=min(low[now],low[next]);
}
else if(vis[next]){
low[now]=min(low[now],dfn[next]);
}
}
if(dfn[now]==low[now]){
int next;
do{
next=stacK[top--];
vis[next]=false;
cout<<next<<" ";
}while(next!=now);
cout<<endl;
}
return ;
}
int main()
{
memset(vis,false,sizeof vis);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>now;
a[i]={i,now};
}
for(int i=1;i<=m;i++){
cin>>now>>y;
u[now].push_back(y);
}
for(int i=1;i<=n;i++){
if(!dfn[i])tarjan(i);
}
return 0;
}
tarjan缩点
最新推荐文章于 2024-07-15 21:36:37 发布