zoukankan      html  css  js  c++  java
  • HDU 1272 小希的迷宫 (并查集)

    小希的迷宫
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u
    Appoint description: 

    Description

    上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走。但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了房间A和B,那么既可以通过它从房间A走到房间B,也可以通过它从房间B走到房间A,为了提高难度,小希希望任意两个房间有且仅有一条路径可以相通(除非走了回头路)。小希现在把她的设计图给你,让你帮忙判断她的设计图是否符合她的设计思路。比如下面的例子,前两个是符合条件的,但是最后一个却有两种方法从5到达8。 
     

    Input

    输入包含多组数据,每组数据是一个以0 0结尾的整数对列表,表示了一条通道连接的两个房间的编号。房间的编号至少为1,且不超过100000。每两组数据之间有一个空行。 
    整个文件以两个-1结尾。 
     

    Output

    对于输入的每一组数据,输出仅包括一行。如果该迷宫符合小希的思路,那么输出"Yes",否则输出"No"。 
     

    Sample Input

    6 8 5 3 5 2 6 4 5 6 0 0 8 1 7 3 6 2 8 9 7 5 7 4 7 8 7 6 0 0 3 8 6 8 6 4 5 3 5 6 5 2 0 0 -1 -1
     

    Sample Output

    Yes Yes No
     
     
     
    判断每次合并的两个是否有相同的父亲,如果是的话答案就是No,另外还要判断一下是否有路,有可能出现有几个森林的情况。另外要注意输入0 0的时候要输出Yes,这是题目的问题,题目并未说清楚。
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <string>
     4 #include <queue>
     5 #include <vector>
     6 #include <map>
     7 #include <algorithm>
     8 #include <cstring>
     9 #include <cctype>
    10 #include <cstdlib>
    11 #include <cmath>
    12 #include <ctime>
    13 using    namespace    std;
    14 
    15 const    int    SIZE = 100005;
    16 int    FATHER[SIZE],RANK[SIZE];
    17 vector<int>    S;
    18 
    19 void    ini(int);
    20 int    find_father(int);
    21 bool    unite(int,int);
    22 bool    same(int,int);
    23 int    main(void)
    24 {
    25     int    a,b;
    26     bool    flag;
    27 
    28     while(scanf("%d%d",&a,&b) && (a != -1 && b != -1))
    29     {
    30         if(a == 0 && b == 0)
    31         {
    32             puts("Yes");
    33             continue;
    34         }
    35         S.clear();
    36         S.push_back(a);
    37         S.push_back(b);
    38         flag = true;
    39         ini(SIZE - 2);
    40         flag = unite(a,b);
    41         while(scanf("%d%d",&a,&b) && (a || b))
    42         {
    43             flag &= unite(a,b);
    44             S.push_back(a);
    45             S.push_back(b);
    46         }
    47         for(int i = 1;i < S.size();i ++)
    48             flag &= same(S[0],S[i]);
    49         printf("%s
    ",flag ? "Yes" : "No");
    50     }
    51 
    52     return    0;
    53 }
    54 
    55 void    ini(int n)
    56 {
    57     for(int i = 1;i <= n;i ++)
    58     {
    59         FATHER[i] = i;
    60         RANK[i] = 0;
    61     }
    62 }
    63 
    64 int    find_father(int n)
    65 {
    66     if(n == FATHER[n])
    67         return    n;
    68     return    FATHER[n] = find_father(FATHER[n]);
    69 }
    70 
    71 bool    unite(int x,int y)
    72 {
    73     x = find_father(x);
    74     y = find_father(y);
    75 
    76     if(x == y)
    77         return    false;
    78     if(RANK[x] < RANK[y])
    79         FATHER[x] = y;
    80     else
    81     {
    82         FATHER[y] = x;
    83         if(RANK[x] == RANK[y])
    84             RANK[x] ++;
    85     }
    86     return    true;
    87 }
    88 
    89 bool    same(int x,int y)
    90 {
    91     return    find_father(x) == find_father(y);
    92 }
  • 相关阅读:
    [CodeIgniter4]-将控制器放入子目录中
    [CodeIgniter4]-控制器
    [CodeIgniter4]-处理多环境
    [CodeIgniter4]-管理多个应用
    [CodeIgniter4]-代码模块
    [CodeIgniter4]-网页缓存
    [CodeIgniter4]-错误处理
    netfilter分析
    使用 SELinux 和 Smack 增强轻量级容器
    如何增强 Linux 系统的安全性,第一部分: Linux 安全模块(LSM)简介
  • 原文地址:https://www.cnblogs.com/xz816111/p/4530394.html
Copyright © 2011-2022 走看看