并查集--模版

题目描述

如题,现在有一个并查集,你需要完成合并和查询操作。

输入格式

第一行包含两个整数N、M,表示共有N个元素和M个操作。

接下来M行,每行包含三个整数Zi、Xi、Yi

当Zi=1时,将Xi与Yi所在的集合合并

当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N

输出格式

如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N、

 

首先先定义数组:fa[]表示这一个点的父亲节点,

并查集一共包含三个部分:

1:初始化     先把所有的点的父亲节点都定义为他本身

1 void init(int n)
2     {
3         for (int i = 0 ;i<=n ;i++)
4         fa[i]=i;
5     }

2: 找根节点   如果此点的父亲节点是他本身,他就是父亲节点,如果不是就找他父亲节点的父亲节点

       直到他的父亲节点是他本身

1 int find(int v)
2 {
3     if (v==fa[v])
4     return v;
5     fa[v]=find(fa[v]);
6     return fa[v];
7     }

3. 合并  把一个数的父亲节点指向另一个节点即把他们两个合并

void update(int u,int v)
{
    int fu= find(u);
    int fv= find(v);
    fa[fu] =fv; 
} 

 

完整代码:

 1 #include 
 2 #include 
 3 using namespace std;
 4 int fa[10005];
 5 void init(int n)
 6     {
 7         for (int i = 0 ;i<=n ;i++)
 8         fa[i]=i;
 9     }
10 int find(int v)
11 {
12     if (v==fa[v])
13     return v;
14     fa[v]=find(fa[v]);
15     return fa[v];
16     }
17 void update(int u,int v)
18 {
19     int fu= find(u);
20     int fv= find(v);
21     fa[fu] =fv; 
22 } 
23 int main()
24 {
25     int n,m;
26     int x,y,z;
27     scanf ("%d%d",&n,&m);
28     init(n);
29     for (int i = 1;i <= m;i++)
30     {
31         scanf ("%d%d%d",&z,&x,&y);
32         if (z==1)
33         update(x,y);
34         else 
35         {
36             if (find(x)==find(y))
37             cout<<"Y"<<endl;
38             else 
39             cout<<"N"<<endl;
40         }
41     }
42     return 0;
43 }

 

你可能感兴趣的:(并查集--模版)