关于并查集的原理这里就不加阐述,参考博文:https://www.tuicool.com/articles/Zb2qYzj
1 int a[maxn]; 2 int fa[maxn]; 3 void UFinit(int x)//并查集的初始化 4 { 5 for(int i = 0; i < x; i++)fa[i] = -1; 6 } 7 int Find(int x)//查找并返回节点x所属集合的根节点 8 { 9 int s;//查找位置 10 for(s = x; fa[s] >= 0; s = fa[s]);//查找到父节点为负数,此时s为根节点 11 while(s != x)//路径压缩 12 { 13 int tmp = fa[x]; 14 fa[x] = s; 15 x = tmp; 16 } 17 return s; 18 } 19 void Union(int x, int y)//x,y属于不同的两个集合,现在合并这两个集合 20 { 21 x = Find(x);//x变成原来x的根节点 22 y = Find(y);//y变成原来y的根节点 23 int tmp = fa[x] + fa[y];//两个集合结点个数之和(负数) 24 //如果y所在集合结点个数 > x所在集合结点个数(负数) 25 if(fa[x] > fa[y]) 26 { 27 fa[x] = y;//将根节点x所在的树作为y的子树 28 fa[y] = tmp;//更新y的结点个数 29 } 30 else 31 { 32 fa[y] = x;//将根节点y所在子树作为x的子树 33 fa[x] = tmp;//更新x的结点个数 34 } 35 }