hdu 1272 并查集

hdu 1272 小希的迷宫

题意:判断图是否连通且无环;

思路:输入边的两点,若两点的父节点相同,则存在环;只有一个根节点则图连通;当输入"0 0"时输出"Yes"

 1 #include<cstdio>
 2 #include<cstring>
 3 
 4 int set[100000 + 50];
 5 bool visit[100000 + 50];
 6 bool flag;
 7 int find(int x)
 8 {
 9     return x == set[x]?x:set[x] = find(set[x]);
10 }
11 
12 void merge(int a, int b)
13 {
14      int i = find(a);
15      int j = find(b);
16      if(i != j) set[i] = j;
17      else flag = true;
18      visit[a] = visit[b] = true;
19      return ;
20 }
21 
22 int main()
23 {
24     int a,b;
25     while(~scanf("%d%d",&a,&b))
26     {
27         if(a == -1 && b == -1)   break;
28         else if(a == 0 && b == 0)
29         {
30             printf("Yes\n");
31             continue;
32         }
33         else
34         {
35             for(int i = 1; i <= 100000; i++)
36                 set[i] = i;
37             merge(a,b);
38         }
39         while(scanf("%d%d",&a,&b) && (a||b))
40         {
41             merge(a,b);
42         }
43         int num = 0;
44         for(int i = 1; i <= 100000; i++)
45         {
46              if(visit[i] && set[i] == i) num++;
47         }
48         if(!flag && num == 1) printf("Yes\n");
49         else printf("No\n");
50         flag = false;
51         memset(visit,0,sizeof(visit));
52     }
53     return 0;
54 }

 

posted @ 2015-08-24 14:24  PosProteus  阅读(96)  评论(0编辑  收藏  举报