Union Find代码块

如果我们要利用Index
比如说我们想把uf[]数组变成下面这样:
{0, 0, 2, 3, 2, 0} 这个意味着node0, node1, node5属于同一个图 node2 node 4 属于另一个图 node3属于单独一个图

//首先 对uf进行初始化 每个的parent都设为自己
for (int i = 0; i < uf.length; i++) {
            uf[i] = i;
        }
//然后我们把题目给的输入转换成一个一个图(就是union起来)加黑色输入是一个List<List<Integer>>
for (List<Integer> pair : pairs) {
            union(pair.get(0), pair.get(1));
        }
//当我们之后想要判断哪些节点属于同一个图 就重新遍历所有的可能节点 利用find()函数找出其root,然后同一个root都聚集在一个List中 这个可以用Hashmap去存,就是说存一个HashMap<Integer, List<Integer>>

//union函数
private void union(int[] uf, int a, int b) { //这两个节点一定是属于同一个图的 
        int aParent = find(a);
        int bParent = find(b);
        if (aParent < bParent) { //往前找root 往前靠 如果a的parent 小一些 就把b的parent重新设为aParent(之前parent[bParent] = bParent)
            uf[bParent] = aParent;
        } else {
            uf[aParent] = bParent;
        }
    }
//find函数
private int find(int[] uf, int x) {
    if (x != uf[x]) {
        uf[x] = find(uf, uf[x]);
    }
    return uf[x];
}

不过为了更直观的表达 parent[] instead of uf[] would be better.
而且可以把uf[]作为一个全局变量 这样就不用每次都要带上这个参数了

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页