如果我们要利用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[]作为一个全局变量 这样就不用每次都要带上这个参数了