并查集
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 }