algorithm_2024/P2661/main.cpp

54 lines
1.1 KiB
C++
Raw Normal View History

2024-10-01 13:08:27 +00:00
#include <algorithm>
#include <iostream>
#include <istream>
#include <queue>
2024-10-01 16:00:28 +00:00
#include <limits>
2024-10-01 13:08:27 +00:00
using std::cin,std::cout;
const int MAX_N {(int)2e5+5};
int n;
2024-10-01 16:00:28 +00:00
int next[MAX_N];
2024-10-01 14:43:16 +00:00
int in_degree[MAX_N];
2024-10-01 13:08:27 +00:00
bool vis[MAX_N];
std::queue<int> q;
2024-10-01 16:00:28 +00:00
int ans {std::numeric_limits<int>::max()};
2024-10-01 14:43:16 +00:00
2024-10-01 09:35:03 +00:00
int main(){
2024-10-01 16:00:28 +00:00
std::iostream::sync_with_stdio(false),cin.tie(0),cout.tie(0);
2024-10-01 13:08:27 +00:00
std::cin>>n;
for(int i=1;i<=n;i++){
2024-10-01 16:00:28 +00:00
cin>>next[i];
in_degree[next[i]]++;
2024-10-01 13:08:27 +00:00
}
const auto push_vis = [](int n){
q.push(n);
vis[n]=true;
};
for(int i=1;i<=n;i++){
2024-10-01 14:43:16 +00:00
if(in_degree[i]<=0){
2024-10-01 13:08:27 +00:00
push_vis(i);
}
}
while(q.empty()==false){
int front = q.front();
q.pop();
2024-10-01 16:00:28 +00:00
if(--in_degree[next[front]]<=0){
push_vis(next[front]);
2024-10-01 13:08:27 +00:00
}
}
for(int i=1;i<=n;i++){
if(vis[i])continue;
2024-10-01 16:00:28 +00:00
int loop_size {0};
int start {i};
int now {start};
do{
vis[now]=true;
now=next[now];
loop_size++;
}while(now!=start);
ans=std::min(ans,loop_size);
2024-10-01 13:08:27 +00:00
}
2024-10-01 16:00:28 +00:00
std::cout<<ans<<"\n";
2024-10-01 09:35:03 +00:00
}