并查集

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define MAX_N 1000
 4 int par[MAX_N];
 5 int ranks[MAX_N];
 6 
 7 //初始化n个元素
 8 void init(int n)
 9 {
10     for(int i=0;i<n;i++){
11         par[i]=i;
12         ranks[i]=0;
13     }
14 }
15 
16 //查询树的根
17 int Find(int x)
18 {
19     if(par[x]==x) return x;
20     else return Find(par[x]);
21 }
22 
23 //合并x和y所属的集合
24 void unite(int x,int y)
25 {
26     x=Find(x);
27     y=Find(y);
28     if(x==y) return;
29     if(ranks[x]<ranks[y]) par[x]=y;
30     else{
31         par[y]=x;
32         if(ranks[x]==ranks[y]) ranks[x]++;//当两棵树等高时,合并后的高度+1
33     }
34 }
35 
36 //判断x和y是否属于同一个集合
37 bool same(int x,int y)
38 {
39     return Find(x)==Find(y);
40 }
41 
42 int main()
43 {
44     init(100);
45     return 0;
46 }

 

posted @ 2018-12-30 20:30  wydxry  阅读(209)  评论(0编辑  收藏  举报
Live2D