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

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1272

    并查集的简单应用

    解题思路:题目意思是找到判断是不是连通无环的图,首先想到的就是并查集。

                  1判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。

                  2判断连通的时候,只要判断根节点数为1即可。

                 注意:当输入的这组数据只有 0 0 时,依然是满足条件的,即应输出 "Yes"。

    View Code
     1  #include<iostream>
     2  using namespace std;
     3  #define MAX 100005
     4  int father[MAX],flag,sign[MAX];
     5  
     6  int FindSet(int x)
     7  {
     8      while(x!=father[x])
     9          x=father[x];
    10      return x;
    11  }
    12  
    13  void Union(int x,int y)
    14  {
    15      x=FindSet(x);
    16      y=FindSet(y);
    17      if(x!=y)
    18          father[x]=y;
    19      else flag=0; //同父节点,成环
    20  }
    21  
    22  int main()
    23  {
    24      int i,a,b;
    25      while(cin>>a>>b)
    26      {
    27          if(a==-1&&b==-1) break;
    28          if(a==0&&b==0)
    29          { cout<<"Yes"<<endl; continue; }
    30          for(i=1;i<MAX;i++) 
    31          {
    32              father[i]=i;
    33              sign[i]=0;
    34          }
    35          sign[a]=sign[b]=1;
    36          flag=1;
    37          Union(a,b);
    38          while(cin>>a>>b)
    39          {
    40              if(a==0&&b==0) break;
    41              Union(a,b);
    42              sign[a]=sign[b]=1;
    43          }
    44          int k=0;
    45          for(i=1;i<MAX;i++)
    46          {
    47              if(sign[i]&&father[i]==i) //判断根节点k数目
    48                  k++; 
    49              if(k>1) flag=0;
    50          }
    51          if(flag) cout<<"Yes"<<endl;
    52          else cout<<"No"<<endl;
    53      }
    54      return 0;
    55  }

     

  • 相关阅读:
    循环语句
    流程控制
    特殊的赋值运算符
    位运算符
    运算符
    八种基本类型
    cmd基础命令
    springboot项目部署到tomcat步骤以及常见问题
    【算法问题】如何实现大整数相加
    【算法问题】删除k个数字后的最小值
  • 原文地址:https://www.cnblogs.com/timeship/p/2622094.html
Copyright © 2011-2022 走看看