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;
    }

 

posted on 2018-08-31 11:46  葫芦胡同749  阅读(108)  评论(0编辑  收藏  举报

导航