update
This commit is contained in:
parent
5df1af7505
commit
9c6b3330b5
@ -19,5 +19,6 @@ add_executable(P1031 ${CMAKE_CURRENT_LIST_DIR}/P1031/main.cpp)
|
|||||||
add_executable(P1031_pro ${CMAKE_CURRENT_LIST_DIR}/P1031/pro.cpp)
|
add_executable(P1031_pro ${CMAKE_CURRENT_LIST_DIR}/P1031/pro.cpp)
|
||||||
|
|
||||||
add_executable(P2661 ${CMAKE_CURRENT_LIST_DIR}/P2661/main.cpp)
|
add_executable(P2661 ${CMAKE_CURRENT_LIST_DIR}/P2661/main.cpp)
|
||||||
|
add_executable(P2661_video ${CMAKE_CURRENT_LIST_DIR}/P2661/video.cpp)
|
||||||
|
|
||||||
add_executable(P2615 ${CMAKE_CURRENT_LIST_DIR}/P2615/P2615.cpp)
|
add_executable(P2615 ${CMAKE_CURRENT_LIST_DIR}/P2615/P2615.cpp)
|
61
P2661/video.cpp
Normal file
61
P2661/video.cpp
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <istream>
|
||||||
|
#include <ranges>
|
||||||
|
#include <queue>
|
||||||
|
#include <limits>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
using std::cin,std::cout;
|
||||||
|
constexpr const auto range = std::ranges::views::iota;
|
||||||
|
|
||||||
|
const int MAX_N = 2e5+5;
|
||||||
|
int n;
|
||||||
|
int next[MAX_N];
|
||||||
|
int in_degree[MAX_N];
|
||||||
|
std::queue<int> q;
|
||||||
|
bool vis[MAX_N];
|
||||||
|
int ans {std::numeric_limits<int>::max()};
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
std::iostream::sync_with_stdio(false),cin.tie(nullptr),cout.tie(0);
|
||||||
|
|
||||||
|
cin>>n;
|
||||||
|
for(const int i:range(1,n+1)){
|
||||||
|
cin>>next[i];
|
||||||
|
in_degree[next[i]]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto push_vis = [](const int n){
|
||||||
|
q.push(n);
|
||||||
|
vis[n]=true;
|
||||||
|
};
|
||||||
|
for(const int i:range(1,n+1)){
|
||||||
|
if(in_degree[i]==0){
|
||||||
|
push_vis(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while(q.empty()==false){
|
||||||
|
int front = q.front();
|
||||||
|
q.pop();
|
||||||
|
in_degree[next[front]]--;
|
||||||
|
if(in_degree[next[front]]==0){
|
||||||
|
push_vis(next[front]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i:range(1,n+1)){
|
||||||
|
if(vis[i])continue;
|
||||||
|
const int start {i};
|
||||||
|
int now {start};
|
||||||
|
int ring_size {0};
|
||||||
|
do{
|
||||||
|
vis[now]=true;
|
||||||
|
ring_size++;
|
||||||
|
now = next[now];
|
||||||
|
}while(now!=start);
|
||||||
|
ans = std::min(ans,ring_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
cout<<ans<<"\n";
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user