并查集

来源:互联网 发布:nginx 压力测试 编辑:程序博客网 时间:2024/06/10 12:01
#include <stdlib.h>/** 并查集. */typedef struct ufs_t {    int *p; /** 树的双亲表示法*/    int size; /** 大小. */} ufs_t;/*** @brief 创建并查集.* @param[in] n 数组的容量* @return 并查集*/ufs_t* ufs_create(int n) {    ufs_t *ufs = (ufs_t*)malloc(sizeof(ufs_t));    int i;    ufs->p = (int*)malloc(n * sizeof(int));    for(i = 0; i < n; i++)        ufs->p[i] = -1;    return ufs;}/*** @brief 销毁并查集.* @param[in] ufs 并查集* @return 无*/void ufs_destroy(ufs_t *ufs) {    free(ufs->p);    free(ufs);}/*** @brief Find 操作,带路径压缩,递归版.* @param[in] s 并查集* @param[in] x 要查找的元素* @return 包含元素x 的树的根*/int ufs_find(ufs_t *ufs, int x) {    if (ufs->p[x] < 0) return x; // 终止条件        return ufs->p[x] = ufs_find(ufs, ufs->p[x]); /* 回溯时的压缩路径*/}/** Find 操作,带路径压缩,迭代版.所谓的路径压缩,就是在每次查找时,令查找路径上的每个节点都直接指向根节点 */static int ufs_find_iterative(ufs_t *ufs, int x) {    int oldx = x; /* 记录原始x */    while (ufs->p[x] >= 0) {        x = ufs->p[x];    }    while (oldx != x) {        int temp = ufs->p[oldx];        ufs->p[oldx] = x;        oldx = temp;    }    return x;}/*** @brief Union 操作,将y 并入到x 所在的集合.* @param[in] s 并查集* @param[in] x 一个元素* @param[in] y 另一个元素* @return 如果二者已经在同一集合,并失败,返回-1,否则返回0*/int ufs_union(ufs_t *ufs, int x, int y) {    const int rx = ufs_find(ufs, x);    const int ry = ufs_find(ufs, y);    if(rx == ry) return -1;    ufs->p[rx] += ufs->p[ry];    ufs->p[ry] = rx;    return 0;}/*** @brief 获取元素所在的集合的大小* @param[in] ufs 并查集* @param[in] x 元素* @return 元素所在的集合的大小*/int ufs_set_size(ufs_t *ufs, int x) {    const int rx = ufs_find(ufs, x);    return -ufs->p[rx];}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 支付宝充话费充错对方关机怎么办 闲鱼同意退款了买家不退东西怎么办 被骗了说给存q币怎么办 方正说我的淘宝字体侵权怎么办 买家说收到衣服没有吊牌该怎么办 淘宝下完订单店主不发货怎么办 工商局不给查被告企业的信息怎么办 被职业打假人起诉到法院怎么办 京东购物如果换货不给你发货怎么办 淘宝上发的快递没有了怎么办 天猫购物半个月不发货怎么办 京东网同一产品购买多规格的怎么办 天猫商城购买的家具要退换货怎么办 亚马逊美国站会员日前没销量怎么办 淘宝买的鞋子把脚磨坏了怎么办 拼多多下单 没货 没法发货怎么办 闲鱼退货物流弄坏了卖家拒收怎么办 客户说物流太慢了 要退货怎么办 京东退货物流系统不更新怎么办 把货交给物流但是物流丢货了怎么办 货还在物流就申请退款怎么办 荣耀4x返回键不管用怎么办 华为手机关不了机也开不了机怎么办 荣耀畅玩5x手机密码忘了怎么办 华为短信验证码失败其他错误怎么办 红米3x手机卡顿反应慢怎么办 华为手机不停的自动重启怎么办 华为荣耀4x卡在开机界面怎么办 华为荣耀8青春版密码忘了怎么办 华为手机内存满了开不起来怎么办 华为荣耀畅玩平板2比较卡怎么办 红米4x太卡了怎么办 魅蓝e移动卡只有2g网络怎么办 联通关闭2g网络双卡手机怎么办 小米6x手机插耳机音量大怎么办 音量键和亮度键盘拆了怎么办 荣耀v10锁屏密码忘了怎么办 荣耀9锁屏密码忘记了怎么办 华为荣耀v9锁屏密码忘记了怎么办 荣耀手机密码忘了怎么办数字锁 华为畅享5忘了开机密码怎么办