题目
https://leetcode-cn.com/problems/redundant-connection/
并查集
在一棵树中,边的数量比树的结点少一个。这道题中的图在树的基础上多了一条附加的边,因此边的数量也是 N。
使用并查集来查找附加的边。一开始所有结点都属于各自独立的一个连通分量,遍历每一条边,如果两个结点属于不同的连通分量则将两个结点合并,合并的两个结点已经属于同一个连通分量则说明这条边是附加的。
class Solution {
private int[] parent;
public int[] findRedundantConnection(int[][] edges) {
int nodes = edges.length;
parent = new int[nodes + 1];
for (int i = 0; i < nodes; i++) {
parent[i] = i;
}
for (int i = 0; i < nodes; i++) {
int[] edge = edges[i];
int node1 = edge[0];
int node2 = edge[1];
if (find(node1) != find(node2)) {
union(node1, node2);
} else {
return edge;
}
}
return new int[0];
}
private void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
parent[rootX] = rootY;
}
private int find(int x) {
if (x != parent[x]) {
parent[x] = find(parent[x]);
}
return parent[x];
}
}