• M


    题目大意:

            emmmmmm

    解题思路:

           抓住迷宫的条件:任意两个房间有且只有一条路。(这里要注意:输入为 0 0 的时候,也要输出yes )。这样的话只要在输入数据的时候同时union,当proot=qroot时,return -1,表示有两条路了,其他就return 1。另外每次都插入set容器中,算结点数。然后所有输入完毕的时候,判断一下根节点的size是不是和节点数量一样,不一样说明不是任意的两个房间之间都有路,也是错的。


    参考代码:

     1 #include <iostream>
     2 #include <vector>
     3 #include <map>
     4 #include <string>
     5 #include <queue>
     6 #include <stack>
     7 #include <set>
     8 
     9 #include <cstdio>
    10 #include <cstring>
    11 #include <cmath>
    12 #include <cstdlib>
    13 using namespace std;
    14 
    15 const int INF=0x3f3f3f3f;
    16 const int SIZE=1e5+10;
    17 
    18 set<int> st;  ///这个是为了两两查找的时候方便一点
    19 int id[SIZE];
    20 int sz[SIZE];
    21 int count;
    22 int find(int x)  ///找跟根结点
    23 {
    24     while(x!=id[x])
    25     {
    26         id[x]=id[id[x]];
    27         x=id[x];
    28     }
    29     return x;
    30 }
    31 
    32 int un(int p,int q)
    33 {
    34     int pr=find(p);
    35     int qr=find(q);
    36     if(pr==qr) return -1;
    37     if(sz[pr]<=sz[qr])
    38     {
    39         sz[qr]+=sz[pr];id[pr]=qr;
    40     }
    41     else
    42     {
    43         sz[pr]+=sz[qr];id[qr]=pr;
    44     }
    45 }
    46 
    47 void clear()
    48 {
    49     for(int i=1;i<=SIZE;i++)
    50     {
    51         id[i]=i;sz[i]=1;
    52     }
    53     st.clear();
    54 }
    55 
    56 int main()
    57 {
    58     int p,q;
    59     int temp,flag;
    60     while(cin>>p>>q)
    61     {
    62         flag=0;
    63         clear();
    64         if(p==-1&&q==-1) break;
    65         if(p==0&&q==0) {cout<<"Yes
    ";continue;}  ///特判0 0的情况
    66         st.insert(p);
    67         st.insert(q);
    68         un(p,q);
    69         int mark=p;
    70 
    71         while(cin>>p>>q)
    72         {
    73             if(p==0&&q==0) break;
    74             temp=un(p,q);
    75             if(temp==-1) flag=1;  ///重复连通了 = =
    76             st.insert(p);st.insert(q);
    77         }
    78 
    79         count=st.size();
    80         if(sz[find(mark)]<count) flag=1;  ///有没有互通
    81         if(flag==1) cout<<"No
    ";
    82         else  cout<<"Yes
    ";
    83     }
    84     return 0;
    85 }
    86  
    87 
    88  
    まだまだだね
  • 相关阅读:
    如何关闭内存自动释放池ARC
    你怀疑过“温水煮青蛙”的故事吗
    程序员应该加入的3个QQ群
    简述Oracle 11g 新特性
    ViewState、UpdatePanel及控件OnPre之间的纠葛
    今天,我看到一组图解释“ 什么是博士?”
    Java将何去何从
    给新手朋友 推荐几本书(从C#入门到SQL及设计模式)
    最新版 智能电脑键盘屏幕全记录 免费下载
    C#中两个问号和一个问号
  • 原文地址:https://www.cnblogs.com/xxQ-1999/p/7469765.html
Copyright © 2020-2023  润新知