#include <bits/stdc++.h>
using namespace std;
#define MaxSize 100
int G[MaxSize][MaxSize];//图的邻接矩阵存储方式,二维矩阵作为参数传递的时候及其不方便
int main()
{
int DSet[MaxSize]; //作为树的根节点的节点的存储值为树的节点数(包括根节点)
//(其实我觉得存储树高会更好点,但是树高计算麻烦吧?毕竟采用的是父节点的存储方式)
}
// int Union(int dset[],int n)//n代表该图的节点数,这个应该是遍历全图的了吧
// {
// for(int i=0;i<n;i++)
// {
// for(int j=i+1;j<n;j++)
// {
// if(G[i][j]!=0&&Find(i,dset)!=Find(j,dset))//i,j之间存在边,且i,j不同属一个集合。
// {
// int a =Find(i,dset),b=Find(j,dset);
// if(-dset[a]>=-dset[b])
// {
// dset[a] += dset[b];
// dset[b] = a;//挂到另一个树的根节点上
// }
// else
// {
// dset[b] += dset[a];
// dset[a] = b;//同上
// }
// }
// }
// }
// }
int Find(int i,int dset[])//如果同根则返回根的序号,带压缩路径则直接采用数组;如果不带压缩路径,单纯的作为find()使用,建议加上const
{
int root=i;
while(dset[root]>=0) root = dset[root];//找到根
//if(temp==root) return dset[root]; //或者根的值
while(dset[root]!=root) //压缩路径
{
int next = dset[root];
dset[root] = root;
root = next;
}
return root;
}
void Union(const int G[],int dset[],int root1,int root2 )//“并”操作,将小树合并到大树上
{
if(root1==root2) return;
else
{
if(dset[root1]>dset[root2]) //root1是大树,root2是小树
{
dset[root1]+=dset[root2]; //合并
dset[root2]=root1;
}
else
{
dset[root2]+=dset[root1];
dset[root1]=root2;
}
}
}
408难民之今年新大纲加了好多东西爷好烦且只能好好学系列之并查集的find和union升级版
最新推荐文章于 2023-03-09 15:17:16 发布