#include<iostream>
#include<queue>
using namespace std;
const int maxn=400000;
struct E{
int to,nxt;
}edge[maxn];
int head[maxn],cnt,in[maxn],visit[maxn];
void add_edge(int x1,int x2){
edge[++cnt].to=x2;
edge[cnt].nxt=head[x1];
head[x1]=cnt;
}
void topo(int n){
queue<int>q;
for(int i=1;i<=n;i++)
if(in[i]==0) q.push(i);
vector<int>ans;
while(!q.empty()){
int p=q.front();
q.pop();
ans.push_back(p);
for(int i=head[p];i;i=edge[i].nxt){
int y=edge[i].to;
in[y]--;
if(in[y]==0)
q.push(y);
}
}
for(int i=0;i<ans.size();i++)
visit[ans[i]]=1;
}
int dfs(int m){
visit[m]=1;
for(int i=head[m];i;i=edge[i].nxt)
{
int y=edge[i].to;
if(visit[y]==0)
{
return dfs(y)+1;
}
}
return 1;
}
int main(){
int n,x1,x2,x3,ans1;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x1;
add_edge(i,x1);
in[x1]++;
}
topo(n);
int m=maxn;
for(int i=1;i<=n;i++){
if(visit[i]==0)
{
m=min(m,dfs(i));
}
}
cout<<m<<endl;
return 0;
}
P2661(拓扑排序找最小环)
最新推荐文章于 2021-08-11 09:25:44 发布