zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    SpringMVC源码阅读(一)
    Struts2技术内幕-----第七章
    1118 Lining Up
    1146 ID Codes
    1056 IMMEDIATE DECODABILITY
    1028 Web Navigation
    1045 Bode Plot
    1083 Moving Tables
    并查集路径压缩
    线段树
  • 原文地址:https://www.cnblogs.com/mogeko/p/10056145.html
Copyright © 2011-2022 走看看