题解 | #城市群数量#并查集做法

城市群数量

http://www.nowcoder.com/practice/71cde4dee669475f94d8d38832374ada

并查集

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param m int整型ArrayList<ArrayList<>> 
     * @return int整型
     */
    public int citys (ArrayList<ArrayList<Integer>> m) {
        // write code here
        if(m.size()==1) return 1;
        UF uf=new UF(m.size());
        // 遍历邻接矩阵
        for(int i=0;i<m.size();i++){
            for(int j=0;j<m.get(0).size();j++){
                if(i==j) continue;
                if(m.get(i).get(j)==1){
                    // 把i和j连通
                    uf.union(i,j);
                }
            }
        }
        // 返回连通分量
        return uf.count();
        
    }
    
    class UF{
        int count; // 连通分量
        int[] parent; // 记录父节点
        // 构造函数,n为结点个数
        UF(int n){
            this.count=n; // 初始连通分量
            this.parent=new int[n];
            for(int i=0;i<n;i++){
                parent[i]=i;  // 初始父节点指向自己
            }
        }
        // 找到x的根节点
        int find(int x){
            while(parent[x]!=x){
                x=parent[x];
            }
            return x;
        }
        // 连接p和q
        void union(int p, int q){
            int rootQ=find(q);
            int rootP=find(p);
            if(rootP!=rootQ){
                parent[rootP]=rootQ;
                count--;
            }            
        }
        // 返回连通分量
        int count(){
            return count;
        }
    }
}
全部评论

相关推荐

07-15 12:24
重庆大学 运营
坏消息:和好工作擦肩而过
给点吧求求了:怎么可能因为差几秒,估计就是简历更好看婉拒了
点赞 评论 收藏
分享
程序员小白条:你是沟通了900个,不是投了900份简历,你能投900份,意味着对面都要回复你900次,你早就找到实习了,没亮点就是这样的,别局限地区,时间投的也要早,现在都要7月了
点赞 评论 收藏
分享
机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
今天 11:27
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务