Luogu P2661 信息传递
Luogu P2661 信息传递 并查集+判环。(这样做甚至能做成在线的,极限复杂度就只有 \(O(n^2)\) ) 我们在连接一个点到另一个点之前,先用并查集判断是否构成一个环,如果是的话,我们就可以记录下这个答案,然后维护最小的答案。 那么,如果构成一个环的话,怎么记录它的长度呢? 我们可以先定义一个变量 \(cnt\) ,在并查集获取祖先的函数中使 \(cnt\) 的值加 \(1\) ,最后函数结束时就能得到这个环的长度了。 还有一点,如果构成了一个环,那就不要把环的结尾连上,否则会死循环。 #include<bits/stdc++.h> #define N 200010 #define INF 0x3f3f3f3f using namespace std; int n,ans=INF,cnt; int fa[N]; void Init() { for(int i=1;i<=n;i++) { fa[i]=i; } return; } int Find(int x) { cnt++; return fa[x]==x?x:Find(fa[x]); } int main() { scanf("%d",&n); Init(); for(int i=1;i<=n;i++) { cnt=0; int t; scanf("%d",&t); if(Find(t)==i) { ans=min