Luogu P2661 [NOIP2015] 信息传递
今天做完并查集突然想起来这道以前做的好(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; }