Problem

Givennnodes labeled from0ton - 1and a list of undirected edges (each edge is a pair of nodes), write a function to find the number of connected components in an undirected graph.

Example 1:

     0          3
     |          |
     1 --- 2    4

Givenn = 5andedges = [[0, 1], [1, 2], [3, 4]], return2.

Example 2:

     0           4
     |           |
     1 --- 2 --- 3

Givenn = 5andedges = [[0, 1], [1, 2], [2, 3], [3, 4]], return1.

Note:
You can assume that no duplicate edges will appear inedges. Since all edges are undirected,[0, 1]is the same as[1, 0]and thus will not appear together inedges.

思路一(dfs)

  • 建一个map
  • 0到n - 1, 如果没有被visited的话,过一遍
    public int countComponents(int n, int[][] edges) {
        List[] list = new List[n];
        for (int i = 0; i < n; i++) {
            list[i] = new ArrayList<Integer>();
        }
        for (int i = 0; i < edges.length; i++) {
            int v1 = edges[i][0];
            int v2 = edges[i][1];
            list[v1].add(v2);
            list[v2].add(v1);
        }
        boolean[] visited = new boolean[n];
        int count = 0;
        for (int i = 0; i < n; i++) {
            if (!visited[i]) {
                dfs (list, i, visited);
                count++;
            }
        }
        return count;
    }

    private void dfs(List[] list, int node, boolean[] visited) {
        visited[node] = true;
        for (Object obj: list[node]) {
            int adj = (int)obj;
            if (visited[adj]) continue;
            dfs(list, adj, visited);
        }
    }

思路二(union find)

  • 传统union find思路, 查询有多少个独立的
    public int countComponents(int n, int[][] edges) {
        List[] list = new List[n];
        for (int i = 0; i < n; i++) {
            list[i] = new ArrayList<Integer>();
        }
        for (int i = 0; i < edges.length; i++) {
            int v1 = edges[i][0];
            int v2 = edges[i][1];
            list[v1].add(v2);
            list[v2].add(v1);
        }
        boolean[] visited = new boolean[n];
        int count = 0;
        for (int i = 0; i < n; i++) {
            if (!visited[i]) {
                dfs (list, i, visited);
                count++;
            }
        }
        return count;
    }

    private void dfs(List[] list, int node, boolean[] visited) {
        visited[node] = true;
        for (Object obj: list[node]) {
            int adj = (int)obj;
            if (visited[adj]) continue;
            dfs(list, adj, visited);
        }
    }

results matching ""

    No results matching ""