• HDU 1272 小希的迷宫


    https://vjudge.net/problem/HDU-1272

    题意:

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

    思路:

    并查集。最后要判断是否成环。这很简单,不成环的条件就是顶点数=边数+1

    需要注意的是如果一开始直接输入两个0,是要输出Yes的。

     1 #include<iostream> 
     2 #include<cstring>
     3 using namespace std;
     4 
     5 const int maxn = 100000 + 5;
     6 
     7 int p[maxn];
     8 int vis[maxn];
     9 
    10 int find(int x)
    11 {
    12     return p[x] == x ? x : find(p[x]);
    13 }
    14 
    15 void Unions(int x, int y)
    16 {
    17     p[x] = y;
    18 }
    19 
    20 int main()
    21 {
    22     freopen("D:\txt.txt", "r", stdin);
    23     int a, b;
    24     while (cin >> a >> b)
    25     {
    26         int cnt = 0, num = 0;
    27         memset(vis, 0, sizeof(vis));
    28         if (a == -1 && b == -1)  break;
    29         if (a == 0 && b == 0)
    30         {
    31             cout << "Yes" << endl;
    32             continue;
    33         }
    34         if (!vis[a])
    35         {
    36             vis[a] = 1;
    37             p[a] = a;
    38             cnt++;
    39         }
    40         if (!vis[b])
    41         {
    42             vis[b] = 1;
    43             p[b] = b;
    44             cnt++;
    45         }
    46         int x = find(a);
    47         int y = find(b);
    48         {
    49             Unions(a, b);
    50         }
    51         num++;
    52         while (cin >> a >> b)
    53         {
    54             if (a == 0 && b == 0)  break;
    55             if (!vis[a])
    56             {
    57                 vis[a] = 1;
    58                 p[a] = a;
    59                 cnt++;
    60             }
    61             if (!vis[b])
    62             {
    63                 vis[b] = 1;
    64                 p[b] = b;
    65                 cnt++;
    66             }
    67             int x = find(a);
    68             int y = find(b);
    69             {
    70                 Unions(a, b);
    71             }
    72             num++;
    73         }
    74         if (cnt == num + 1)     cout << "Yes" << endl;
    75         else cout << "No" << endl;
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    spring-schedule
    数字电路
    面试题
    CMOS集成门电路
    TTL特殊门电路
    TTL反相器的外部特性
    TTL集成门电路工作原理和电压传输特性
    半导体器件的开关特性和分立元件门电路
    逻辑函数的公式化减法
    php 获取当前文件名称
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6386531.html
Copyright © 2020-2023  润新知