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
まだまだだね