Luogu P2661 [NOIP2015] 信息传递

qwq

今天做完并查集突然想起来这道以前做的好(shui)题,

虽然是黄题,但是是并查集一个比较特别的用法

这道题大概可以用求最小环的方式来做,但是从直觉上果然还是并查集w

乍一看只要求出“父→子”即为环,每次getfa时环长度+1,再用min维护环的最小值即可

这时如果用平时的习惯写路径压缩的话,就会得到 Unaccepted 10

这是因为这道题当且仅当找到环时需要记录路径长度,

所以在连接的途中一旦压缩了路径,就会在最后寻找环时忽略一部分长度

其次,当找到环时不需要把构成环的最后一条路连接,

否则下次有另一个点指向这个环时就会陷入死循环orz

代码如下

#include<cstdio>
#define min(x,y) (x)<(y)?(x):(y)
using namespace std;
int fa[1000005],n,k,dpth,ans = 10000005;
int getfa(int x,int &d) {
    d++;
    if(fa[x] == x)
        return x;
    return getfa(fa[x],d);
}
int main() {
    scanf("%d",&n);
    for(int i = 1; i <= n; i++)
        fa[i] = i;
    for(int i = 1; i <= n; i++) {
        scanf("%d",&k);
     dpth = 0;
     int qwq;
        if(getfa(k,dpth) == getfa(i,qwq)) 
            ans = min(ans,dpth);
        else
            fa[i] = k;
    }
    printf("%d",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/mogeko/p/10056145.html