• 小希的迷宫


    小希的迷宫

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
    Total Submission(s) : 20   Accepted Submission(s) : 2

    Font: Times New Roman | Verdana | Georgia

    Font Size:

    Problem 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
    
    并查集的应用
    注意是“有且仅有”就要保证最终只有一个集合,且每个点都只有一条路。
     1 #include<stdio.h>
     2 int father[100005],depth[100005];
     3 int a[200005];
     4 void init()
     5 {
     6     int i;
     7     for(i = 1; i < 100005;i ++)
     8     {
     9         father[i] = i;
    10         depth[i] = 0;
    11     }
    12 }
    13 
    14 int find(int x)
    15 {
    16     if(x==father[x])
    17         return x;
    18     else
    19         return father[x] = find(father[x]);
    20 }
    21 
    22 void unit(int x,int y)
    23 {
    24     x = find(x);
    25     y = find(y);
    26     if(x==y)
    27         return ;
    28     if(depth[x]<depth[y])
    29     {
    30         father[x] = y;
    31     }
    32     else
    33     {
    34         if(depth[x]>depth[y])
    35             father[y] = x;
    36         else
    37         {
    38             father[x] = y;
    39             depth[y]++;
    40         }
    41     }
    42 }
    43 
    44 int main()
    45 {
    46     int i,j,k = 1,flag,con,temp = -1;
    47     while(~scanf("%d%d",&a[k],&a[k+1])&&(a[k]!=-1||a[k+1]!=-1))
    48     {
    49         con = 0;
    50         if(a[k]==0&&a[k+1]==0)
    51         {
    52             printf("Yes
    ");
    53             continue ;
    54         }
    55         flag = 0;
    56         init();
    57         unit(a[k],a[k+1]);
    58         k += 2;
    59         while(~scanf("%d%d",&a[k],&a[k+1])&&(a[k]||a[k+1]))
    60         {
    61             if(find(a[k])==find(a[k+1]))  //判断是否只有一条路,做到“有”。
    62                 flag = 1;
    63             else
    64                 unit(a[k],a[k+1]);
    65             k += 2;
    66         }
    67         for(j = 1;j < k;j ++)
    68         {
    69             if(a[j]==find(a[j])&&(temp!=a[j]))  //判断是否只有一个集合,做到”仅有“。
    70             {
    71                 con++;
    72                 temp = a[j];
    73             }
    74             if(con==2)
    75                 break ;
    76         }
    77         if(k==3&&(a[1]==a[2]))
    78             flag = 1;
    79         if(!flag&&(con==1))
    80             printf("Yes
    ");
    81         else
    82             printf("No
    ");
    83         k = 1;
    84         temp = -1;
    85     }
    86     return 0;
    87 }
  • 相关阅读:
    谈谈对Javascript构造函数和原型对象的理解
    JS 实现无缝滚动动画原理(初学者入)
    $($('.className').html( )选择器的工作原理
    jquery中attr和prop的区别
    用for循环筛选奇偶表格栏
    insertBefore 和 insetAfter函数详解
    getNextElement( )函数——获取下一个特定的元素节点
    IDEA + SSH OA 第一天(项目收获:Hibernate XML)
    IDEA + SSH OA 第一天(IDEA 文件夹类型了解)
    IDEA + SSH OA 第一天(Hibernate : Mapping (RESOURCE) not found)
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3314071.html
Copyright © 2020-2023  润新知