Graph Valid Tree(261)
本题为Union Find的问题
判断一些边是不是tree有3个要素
1. 边的个数是不是点的个数-1;
2. 每个边加入都不可以成环; (加入边时做check)
3. 所有边都加入后,边必须都相连; (所有边都加入后看看union的个数)
首先定义UnionFind的class。 定义接口
class UnionFind{ int[] father; int size; public UnionFind(int size){ father = new int[size]; for(int i = 0 ; i < size; ++i){ father[i] = i; } this.size = size; } public void union(int a, int b){ int father_a = findRoot(a); int father_b = findRoot(b); if(father_a != father_b){ father[father_a] = father_b; size--; } } public int findRoot(int a){ while(father[a] != a){ father[a] = father[father[a]]; a = father[a]; } return a; } }
主函数只需要调用我们的class就可以了
public boolean validTree(int n, int[][] edges) { // edge have to be n-1 node if(n-1 != edges.length) return false; //doing union find for all edges. UnionFind uf = new UnionFind(n); for(int[] edge: edges){ int n1 = edge[0]; int n2 = edge[1]; if(uf.findRoot(n1) == uf.findRoot(n2)){ return false; } uf.union(n1, n2); } return uf.size == 1; }