zoukankan      html  css  js  c++  java
  • P2661信息传递(并查集求最小环)

    例题:洛谷信息传递

    求最小环是2015年NOIP的一道题,作为蒟蒻的我并不会这道题,看了题解之后做个笔记吧!

    要求最小环我们得找出所有的环,找环的办法就是读入i的父亲之后,判断他俩是否现在已经连上了,如果已经连上了,那么就构成了一个环,此时就不需要再将他们两个连上了,不然就会死循环,这时估计就有人会问,不连上他们,那么如果有包含这一条边的环比你现在的环还小你不就错了么?(这就是这题的图的特殊了,因为对于每一个点只会有一个父亲,按照我们的遍历方式来看,所以此时ii的父亲的父亲都已经知道了,那么就不可能再会有别的环经过这条边了),当然,如果此时父亲不同就把i并入

     1 #include<iostream>
     2 #include<vector>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<climits>
     6 using namespace std;
     7 int fa[200010];
     8 int res=INT_MAX;
     9 int cnt=0;
    10 int find(int x)
    11 {
    12     cnt++;
    13     if(fa[x]==x)
    14         return fa[x];
    15     else
    16         return find(fa[x]);
    17 }
    18 int main()
    19 {
    20     int n;
    21     cin>>n;
    22     for(int i=1;i<=n;i++)
    23         fa[i]=i;
    24     for(int i=1;i<=n;i++)
    25     {
    26         cnt=0;
    27         int t;
    28         cin>>t;
    29         if(find(t)==i)
    30         {
    31             res=min(res,cnt);
    32         }
    33         else
    34         {
    35             fa[i]=t;
    36         }
    37     }
    38     cout<<res;
    39     return 0;
    40 }
  • 相关阅读:
    容器占用空间的小问题
    一个ipv4到ipv6的移植问题
    一个linux内核模块移植到低版本时发生的异常
    一个发包乱序问题记录
    一个docker镜像中的目录删除不了问题
    C/C++(共用体与枚举)
    C/C++(数据结构栈的实现)
    C/C++(结构体)
    C/C++(内存管理)
    C/C++(指针数组)
  • 原文地址:https://www.cnblogs.com/greenofyu/p/12002362.html
Copyright © 2011-2022 走看看