Problem
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree.
For example:
Given n = 5 and edges = [[0, 1], [0, 2], [0, 3], [1, 4]], return true.
Given n = 5 and edges = [[0, 1], [1, 2], [2, 3], [1, 3], [1, 4]], return false.
Note: you can assume that no duplicate edges will appear in edges. Since all edges are undirected, [0, 1] is the same as [1, 0] and thus will not appear together inedges.
Solution
想到union find 就好办了。
实现 union - find , 有两种实现方式,quick-union 和 quick-find ( 参看
这里 )
quick-union 实现比较简单 : 初始化大小为n, default value = -1的数组 arr, arr[ i ]= j 就表示 i 的父节点是 j ,
这样如果两个数字的父节点相同就说明在同一个union里; 参考下图
Solution
class Solution {
int find(const vector<int>& arr, int e){
if(arr[e] == -1){
return e;
}
return find(arr, arr[e]);
}
public:
bool validTree(int n, vector<pair<int, int>>& edges) {
vector<int> root(n, -1);
for( auto edge : edges){
int set1 = find(root, edge.first);
int set2 = find(root, edge.second);
if(set1 == set2)
return false;
root[set1] = set2;
}
return edges.size() == n -1; // <span style="color:#ff0000;">buggy 不能简单的return true. e.g. edge太少,没能连通。</span>
}
};
本文介绍了一种使用Union-Find算法来判断一组无向边是否构成有效树的方法。通过实现Quick-Union算法,确保了图中不存在环且所有节点都是连通的。文中提供了一个具体的解决方案,并通过示例展示了算法的工作原理。
5884

被折叠的 条评论
为什么被折叠?



