小希的迷宫 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 } 

 

posted @ 2021-01-13 08:56  acmloser  阅读(60)  评论(0编辑  收藏  举报