小希的迷宫 HDU - 1272
考察:基础并查集
思路:
已经在集合的不能在连边
易错:
注意所有房间都要连通.所以最后正确的图是一张最小生成树
1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 #include <set> 5 using namespace std;//思路:已经在集合的不能在连边 6 typedef pair<int,int> pii; 7 const int N = 100010; 8 int p[N]; 9 int findf(int x) 10 { 11 if(p[x]!=x) p[x]=findf(p[x]); 12 return p[x]; 13 } 14 bool merge(int x,int y) 15 { 16 x = findf(x); y = findf(y); 17 if(x==y) return false; 18 p[x] = y; 19 return true; 20 } 21 int main() 22 { 23 int x,y; 24 while(true) 25 { 26 vector<pii> v; set<int> s; 27 int maxn = -1,cnt = 0; 28 bool flag = true; 29 while(scanf("%d%d",&x,&y)&&x) 30 { 31 if(x==-1) return 0; 32 s.insert(x); s.insert(y); 33 v.push_back({x,y}); 34 maxn = max(maxn,max(x,y)); 35 } 36 for(int i=1;i<=maxn;i++) p[i] = i; 37 for(int i=0;i<v.size();i++) 38 { 39 int x = v[i].first,y = v[i].second; 40 if(!merge(x,y)){ 41 flag = false; 42 break; 43 }else cnt++; 44 } 45 if((flag&&cnt==s.size()-1)||!s.size()) printf("Yes\n"); 46 else printf("No\n"); 47 } 48 return 0; 49 }