• 利用并查集判断一个无向图是否成树


    hdu 1272

    利用并查集方法,找到各点的根节点。

    几点注意:

    一、树:1.无环 2.根节点入度为0,其余入度为1

    判断依据:

    1.若两个点的根节点相同(这两个点是父子关系),则形成环。

    2.若所有点中只有一个点的根节点是他本身,则根节点入度为0。

    二、

    1. 0 0 :空树也是一颗树。

     1 #include<iostream>
     2 #include<algorithm>
     3 #define Max 100005
     4 using namespace std;
     5 
     6 int f[Max];
     7 
     8 int root(int i)
     9 {
    10     if(f[i] == i)
    11         return i;
    12     else
    13         return root(f[i]);
    14 }
    15 int huan;
    16 void U(int a,int b)
    17 {
    18     int f1,f2;
    19     f1 = root(a);
    20     f2 = root(b);
    21     if(f1 != f2)
    22     {
    23         f[f1] = f2;
    24     }
    25     else
    26     {
    27         huan  = 1;//子环
    28     }
    29 }
    30 int main()
    31 {
    32     int n,m,i,j,k,t;
    33     while(~scanf("%d %d",&n,&m))
    34     {
    35         huan = 0;
    36         memset(f,0,sizeof(f));
    37         if(m == -1 && n == -1)
    38             break;
    39         else if(m == 0 && n == 0)
    40         {
    41             printf("Yes
    ");
    42             continue;
    43         }
    44         else
    45         {    
    46             f[n] = n;
    47             f[m] = m;
    48             U(n,m);        
    49         }
    50         while(~scanf("%d %d",&n,&m))
    51         {
    52             if(n == 0 && m == 0)
    53                 break;
    54             else
    55             {
    56                 if(f[n] == 0)
    57                 {
    58                     f[n] = n; 
    59                 }
    60                 if(f[m] == 0)
    61                 {
    62                     f[m] = m;
    63                 }
    64                 U(n,m);
    65             }
    66         }
    67         if(huan)
    68         {
    69             printf("No
    ");
    70             continue;
    71         }
    72         k = 0;
    73         for(i = 0;i < Max;i ++)
    74         {
    75             if(f[i] == i && f[i] != 0) //只有一个点的根节点是他本身
    76                 k ++;
    77         }
    78         if(k == 1)
    79             printf("Yes
    ");
    80         else
    81             printf("No
    ");
    82     }
    83     return 0;
    84 }
    C++
  • 相关阅读:
    winform编程设定listview选中行
    更新客户信息
    在Flutter中使用Android、iOS的原生 View
    怎么卸载nodejs?
    JavaScript实现简单的图片瀑布流插件
    通过代码重用攻击绕过现代XSS防御
    炫酷的播放粒子效果,你也可以学会!使用Web动画API制作
    14行实现js原生语法前端模板引擎
    什么是ESLint?
    js中require和import的区别
  • 原文地址:https://www.cnblogs.com/ypacm/p/6690807.html
Copyright © 2020-2023  润新知