zoukankan      html  css  js  c++  java
  • hdu 1272 小希的迷宫

    小希的迷宫

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 22224    Accepted Submission(s): 6801

    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、读入过程中,合并集合的时候,如果,当前读入的两个元素属于同一个集合,那么肯定是No~;
    2、不要忘了最后要判断所有的点都要是连通的哦~不能有孤立的;
    3、读入只有0 0的时候,要输出Yes。。。(最坑爹的数据)

       1:  #include<stdlib.h>
       2:  #include<stdio.h>
       3:  #include<string.h>
       4:  #include<math.h>
       5:  #define maxn 100001
       6:  int id[maxn];
       7:  int appear[maxn]; //记录出现哪些节点
       8:  void init(){
       9:      int i;
      10:      for(i=0;i<maxn;i++){
      11:          id[i]=-1;
      12:          appear[i]=0;
      13:      }
      14:  }
      15:  int find_root(int x){
      16:      if(id[x]==-1)
      17:          return x;    
      18:      return id[x]=find_root(id[x]);
      19:  }
      20:  int judge(int x,int y){
      21:      return find_root(x)==find_root(y);
      22:  }
      23:  void Union(int x,int y){
      24:      if(find_root(x)==find_root(y))
      25:          return;
      26:      id[find_root(y)]=find_root(x);
      27:  }
      28:  int main(){
      29:      int n,m,sum,i,flag=1,cnt=0;
      30:      init();
      31:      while(scanf("%d %d",&n,&m)!=EOF && (n!=-1||m!=-1)){
      32:          if(n==0 && m==0){
      33:              if(cnt==0){
      34:                  printf("Yes
    ");
      35:                  continue;
      36:              }
      37:              sum=0;
      38:              for( i=0;i<maxn;i++){
      39:                  if(appear[i] &&id[i]==-1)
      40:                      sum+=1;
      41:              }
      42:              if(flag==1&&sum==1)
      43:                  printf("Yes
    ");
      44:              else
      45:                  printf("No
    ");
      46:              flag=1;
      47:              cnt=0;
      48:              init();
      49:          }
      50:          else{
      51:              if(judge(n,m))      //如果刚输入的两个点在一个集合内,应输出No~~
      52:                  flag=0;
      53:              Union(n,m);
      54:              appear[n]=1;
      55:              appear[m]=1;
      56:              cnt++;            //辅助判断是不是第一对数就是 0 0 
      57:          }
      58:      }
      59:  }
  • 相关阅读:
    sizeof注意
    如何获取存储过程的返回值和输出值
    OA、ERP、SRM、PLM、CAPP、MES、LIMS、CRM
    js1号脚本
    Python各类常用库整理
    Html设计器
    python从入门到放弃之图像处理
    C# Web API操作Sqlite数据库
    C# Naudio 从麦克风输入到声卡输出 录音 放音功能
    WPF/MVVM模式入门教程(二):实现INotifyPropertyChanged接口
  • 原文地址:https://www.cnblogs.com/ZJUT-jiangnan/p/3562271.html
Copyright © 2011-2022 走看看