博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
union-find算法Java实现
阅读量:7002 次
发布时间:2019-06-27

本文共 1850 字,大约阅读时间需要 6 分钟。

package practice;/*在一个全是点的图中,循环选择两点连通,之后判断两点是否在同一通路*/public class Testmain  {    public static void main(String[] args)     {        UF uf = new UF(10);        uf.union(4, 3);        uf.union(3, 8);        uf.union(6, 5);        uf.union(9, 4);        uf.union(2, 1);        uf.union(5, 0);        uf.union(7, 2);        uf.union(6, 1);        System.out.println(uf.connected(8, 9));        System.out.println(uf.connected(1, 0));        System.out.println(uf.connected(6, 7));        for (int i = 0; i < 10; i++)         {            System.out.println(uf.find(i));        }    }    }class UF{    int [] id; //点的父节点    int [] sz; //点的权    /**     * @param N 点的个数     */    public UF(int N)     {        id = new int[N];        sz = new int[N];        for (int i = 0; i < N; i++)         { id[i] = i; sz[i] = 1;}    }    /**     * @param p     * @param q 要连通的两点     */    void union(int p,int q)     {        int pboot = find(p); //找到此点的根节点        int qboot = find(q); //同上        if (pboot == qboot) return; //如果在同一通路,返回        if (sz[pboot] >= sz[qboot])         { id[qboot] = pboot; sz[pboot] += sz[qboot];}        else         { id[qboot] = pboot; sz[qboot] += sz[pboot];} //将权值小的根节点连在权值大的根节点上,并将权值相加赋给连接后的根节点    }    /**     * @param p 要找的点     * @return p的根节点     */    int find(int p) {        int temp = p;        while (p != id[p]) { p = id[p];} //一直向上找父节点,直到节点的父节点为自身,则为根节点        while (temp != id[temp]) //将找过的点全部连在根节点上        {            int temp2 = temp;            temp = id[temp];            id[temp2] = p;        }        return p;    }    boolean connected(int p,int q) //判断两点是否连通    { return find(p) == find(q);}}

算法示意图(图片来自《算法(第四版官网)》)

关于加权

给每个节点都赋一个权值,权值可以表示点在树的哪一层,根节点的权值最大,每向下一层权值递减一,最下层权值为一。所一可以通过比较根节点的权值,让层数少的树连在层数大的树上,使最后树的层数更少。

关于路径压缩

在找点的根节点时,直接将点连在根节点上,使树的层数更少,算法更快。

 

转载于:https://www.cnblogs.com/zhangqi66/p/7244650.html

你可能感兴趣的文章
java中sleep()和wait()的区别
查看>>
[JAVA]UUID
查看>>
Win10优化
查看>>
【洛谷P1352】没有上司的舞会
查看>>
js中数组的合并和对象的合并
查看>>
解决 UE4 无法找到。generated.h 办法
查看>>
python 读取SQLServer数据插入到MongoDB数据库中
查看>>
TCP的三次握手与四次挥手(详解+动图)
查看>>
装饰器
查看>>
shell基础(八)-循环语句
查看>>
python3.6 安装jupyter,打不开notebook
查看>>
【转】loadrunner场景对性能测试策略的映射
查看>>
JMeter性能测试,完整入门篇
查看>>
[转]怪异的CheckedListBox数据绑定
查看>>
.Net的异步机制(委托Delegate) - STEP 1
查看>>
Django配合使用Jquery post方法
查看>>
hadoop再次集群搭建(3)-如何选择相应的hadoop版本
查看>>
spring mvc default-servlet mvc:resources mvc:default-servlet-handler区别
查看>>
ORACLE存储过程 练习系列一 关键字 部门树
查看>>
理解 Visual C++ 应用程序的依赖项(msdn)
查看>>