zoukankan      html  css  js  c++  java
  • 并查集小结

    并查集就是一个可以连通一块东西的工具。


    基础:

    这么理解吧,有一堆亲戚,每次给你两个人,告诉你他们是亲戚,最后任意给你两个人,问他们是不是亲戚。

    这个时候,并查集就大显神通了。我们可以每次输入两个数,如果这两个数不在一块,把这两个数连接起来,到了最后,不就是变成了一棵树了吗?最后查询时,每次看他们是不是在一棵树上就行,也就可以查询他们的根是不是一样的。

    并查集实现的就是大概这样一个功能,下面给出代码:

    查找:

    int find(int x){
    	if(fa[x] != x) return find(fa[x]);
    	else return x;
    }
    

    合并:

    void un(int x , int y){
    	int xx = find(x) , yy = find(y);
    	fa[xx] = yy;
    }
    

    (fa[i])就是指某一个节点的父亲,对其初始化时肯定是(fa[i]=i),指向自己。


    优化

    可是,有的时候,这条链会被拉的很长,像这样:
    很长的链~

    这样往上搜索时,会很耗费时间,这个时候怎么办呢,优化:

    路径压缩:
    因为我们只用找到他们的根节点就可以看他们是不是一起的了,为何不让他们都直接指向根节点呢?像这样:
    很短的链~

    这样过后,查找时间就变短了,合并的代码肯定就不变了,下面给出查找的代码:

    int find(int x){
    	if(x == fa[x]) return x;
    	else return fa[x] = find(fa[x]);
    }
    

    总结:其实优化还有一种方法,叫按秩合并,但是优化作用没路径压缩大,也不太好写,只有路径压缩就已经够了嗐就是不会而已

    亿道并查集联系题:奶酪

  • 相关阅读:
    Laravel update某一字段值为另一字段值
    Layui 批量
    CI 框架多表关联查询
    PHP数组函数
    PHP固定长度字符串
    PHP常用方法汇总
    CI 框架批量添加数据(如果数据库有就更新数据)
    使用nginx-http-concat优化网站响应
    mysql自动化安装
    SQL迁移到ORACLE实例
  • 原文地址:https://www.cnblogs.com/bzzs/p/13095399.html
Copyright © 2011-2022 走看看