zrq495
www.zrq495.com

并查集。781MS,水过。。。

代码:

 1 #include<iostream>
 2 #include<cstring>
 3 
 4 using namespace std;
 5 
 6 int set[100002], mark[100002];
 7 int flag;
 8 
 9 int find(int a)  // 查找a的根结点
10 {
11     int x=a;
12     while(set[x] != x)
13         x=set[x];
14     return x;
15 }
16 
17 void merge(int a, int b)  //合并a和b都的根结点
18 {
19     int x=find(a);
20     int y=find(b);
21     if (x == y)
22         flag=0;
23     else
24         set[x]=y;
25 }
26 
27 int main()
28 {
29     int n, m, i;
30     int cnt;
31     while (cin >> n >> m, n!=-1 || m!=-1)
32     {
33         if (!n && !m)
34         {
35             cout << "Yes" << endl;
36             continue;
37         }
38         flag=1;
39         cnt=0;
40         memset(mark, 0, sizeof(mark));
41         for (i=0; i<100002; i++)
42             set[i]=i;
43         while(n || m)
44         {
45             merge(n, m);
46             mark[n]=mark[m]=1;
47             cin >> n >> m;
48         }
49         for (i=1; i<100002; i++)  //查找是否有多个集合
50         {
51             if (set[i] == i && mark[i])
52             {
53                 cnt++;
54                 if (cnt > 1)
55                 {
56                     flag=0;
57                     break;
58                 }
59             }
60         }
61         if (flag) cout << "Yes" << endl;
62         else cout << "No" << endl;
63     }
64     return 0;
65 }
posted on 2012-08-03 15:32  zrq495  阅读(116)  评论(0编辑  收藏  举报