zoukankan      html  css  js  c++  java
  • 323.Number of Connected Components in an Undirected Graph

        /*
         * 323.Number of Connected Components in an Undirected Graph
         * 2016-4-2 by Mingyang
         * 这个题目自己也是花了一段时间,自己的思路是先构建一个HashMap,每个值对应一个相邻边的list,然后根据list的长度的大小,如果为0表示res++
         * 如果为1加到queue里面去,再一个一个的取消和自己的通路,像有向图那样,从list里面remove掉!结果发现行不通,万一很多点都是两个list 长度
         * 那么就没法,所以我现在回归无向图的基本方法,就是用boolean记录访问过没,每到一个点就visited 为true,然后他会进去把自己的所有的相邻边
         * 全部感染,访问。最后再跳出来。BFS很好的例子!!!
         */
         public int countComponents(int n, int[][] edges) {
                if (n <= 1) {
                    return n;
                }
                List<List<Integer>> adjList = new ArrayList<List<Integer>>();
                for (int i = 0; i < n; i++) {
                    adjList.add(new ArrayList<Integer>());
                }
                for (int[] edge : edges) {
                    adjList.get(edge[0]).add(edge[1]);
                    adjList.get(edge[1]).add(edge[0]);
                }
                boolean[] visited = new boolean[n];
                int count = 0;
                for (int i = 0; i < n; i++) {
                    if (!visited[i]) {
                        count++;
                        dfs(visited, i, adjList);
                    }
                }
                return count;
            }
            public void dfs(boolean[] visited, int index, List<List<Integer>> adjList) {
                visited[index] = true;
                for (int i : adjList.get(index)) {
                    if (!visited[i]) {
                        dfs(visited, i, adjList);
                    }
                }
            }

     不过还是Union Find要简单一些

     private int[] father;
    public int countComponents(int n, int[][] edges) {
        Set<Integer> set = new HashSet<Integer>();
        father = new int[n];
        for (int i = 0; i < n; i++) {
            father[i] = i;
        }
        for (int i = 0; i < edges.length; i++) {
             union(edges[i][0], edges[i][1]);
        }
        for (int i = 0; i < n; i++){ 
            set.add(find(i));
        }
        return set.size();
    }
    int find(int node) {
        if (father[node] == node) {
            return node;
        }
        father[node] = find(father[node]);
        return father[node];
    }
    
    void union(int node1, int node2) {
        father[find(node1)] = find(node2);
    }
  • 相关阅读:
    微信登录
    Nginx负载均衡的优缺点
    elk 比较不错的博客
    Filebeat 5.x 日志收集器 安装和配置
    日志管理系统ELK6.2.3
    python3爬虫编码问题
    zabbix监控进程
    linux下查询进程占用的内存方法总结
    Ubuntu 16.04安装Elasticsearch,Logstash和Kibana(ELK)Filebeat
    ELK多种架构及优劣
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5652449.html
Copyright © 2011-2022 走看看