M - 小希的迷宫 HDU - 1272

题目大意:

        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\n";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\n";
82         else  cout<<"Yes\n";
83     }
84     return 0;
85 }
86  
87 
88  

 

posted @ 2017-09-01 21:11  小可爱的小可爱  阅读(102)  评论(0编辑  收藏  举报