并查集写成一个类

这个应该不用多说。。

 1 #include <cstdio>
 2 using namespace std;
 3 
 4 const int maxn=10005;
 5 int n, m;
 6 
 7 struct Ufset{
 8     int fa[maxn], size[maxn];
 9 
10     Ufset(int n){
11         for (int i=1; i<=n; ++i){
12             fa[i]=i;
13             size[i]=1;
14         }
15         return;
16     }
17 
18     int find(int x){
19         int anc, realf;
20         for (anc=x; fa[anc]!=anc; anc=fa[anc]);
21         while (fa[x]!=x){
22             realf=fa[x];
23             fa[x]=anc;
24             x=realf;
25         }
26         return anc;
27     }
28 
29     bool in_same(int x, int y){
30         if (find(x)!=find(y)) return false;
31         else return true;
32     }
33 
34     void merge_to(int x, int y){ //merge x to y
35         int fx=find(x), fy=find(y);
36         fa[fx]=fy;
37         return;
38     }
39 
40     void merge(int x, int y){
41         if (size[x]>size[y])
42             merge_to(y, x);
43         else merge_to(x, y);
44     }
45 };
46 
47 int main(){
48     scanf("%d%d", &n, &m);
49     Ufset ufset1(n);
50     int z, x, y;
51     for (int i=0; i<m; ++i){
52         scanf("%d%d%d", &z, &x, &y);
53         if (z==1)
54             ufset1.merge(x, y);
55         else
56             printf("%c\n",
57                    ufset1.in_same(x, y)?'Y':'N');
58     }
59     return 0;
60 }

来自luoguP3367

posted @ 2017-08-29 20:05  pechpo  阅读(140)  评论(0编辑  收藏  举报