408难民之今年新大纲加了好多东西爷好烦且只能好好学系列之并查集的find和union升级版

#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;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值