zoukankan      html  css  js  c++  java
  • hdu1272 小希的迷宫 基础并查集

     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <cstdio>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int M = 100005;
     8 int a, b;
     9 int father[M];       //记录父节点 
    10 bool circle;         //判断是否存在环 
    11 bool visit[M];       //用来记录顶点数  
    12 int edgenum, vnum;    //分别表示边数,顶点数 
    13 
    14 void initial()
    15 {
    16     for (int i = 0; i<M; i++)
    17         father[i] = i, visit[i] = false;
    18     circle = false;
    19     edgenum = vnum = 0;
    20 }
    21 
    22 //(查)
    23 int find(int x)
    24 {
    25     return x == father[x] ? x : father[x] = find(father[x]);     //找祖先节点 + 路径压缩 
    26 }
    27 
    28 //(并)
    29 void merge(int a, int b)
    30 {
    31     if (a == b)
    32         circle = true;
    33     int x, y;
    34     x = find(a);
    35     y = find(b);
    36     if (x != y)
    37     {
    38         father[x] = y;
    39         edgenum++;       //引出一条边 
    40     }
    41     else
    42         circle = true;   //x==y,说明他们是同一个祖先,一旦连通便与祖先3者成环 
    43 }
    44 
    45 int main()
    46 {
    47     while (true)
    48     {
    49         initial();
    50         scanf("%d%d", &a, &b);
    51         if (a == 0 && b == 0)
    52         {     //为空树 
    53             printf("Yes
    ");
    54             continue;
    55         }
    56         if (a == -1 && b == -1)
    57             break;
    58         visit[a] = true;
    59         visit[b] = true;
    60         merge(a, b);
    61         while (true)
    62         {
    63             scanf("%d%d", &a, &b);
    64             if (a == 0 && b == 0)
    65                 break;
    66             visit[a] = true;
    67             visit[b] = true;
    68             merge(a, b);
    69         }
    70         for (int i = 0; i < M; i++)
    71         {
    72             if (visit[i])
    73                 vnum++;
    74         }
    75         if (!circle && edgenum + 1 == vnum)
    76             printf("Yes
    ");
    77         else
    78             printf("No
    ");
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    adb、monkey常用命令
    震惊!90%的程序员不知道的Java知识!
    Android,重新出发!
    Fiddler 手机抓包 手机联网异常解决方案
    技术贴汇总
    Android开发日常-listview滚动方法梳理
    JavaScript基本语法
    Spring Boot Profile
    Spring Boot配置文件占位符
    @PropertySource和@ImportSource
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/7211848.html
Copyright © 2011-2022 走看看