Number of Connected Components in an Undirected Graph

这道题就是纯考一个union find的实现,因为是无向图,所以实现非常简单,下面是代码

class Solution(object):
    def countComponents(self, n, edges):
        """
        :type n: int
        :type edges: List[List[int]]
        :rtype: int
        """
        parent = [-1] * n                                            # 建立一个parent数组储存union find信息

        for st, ed in edges:                                         
            a = self.find(st, parent)
            b = self.find(ed, parent)
            if a != b:
                parent[a] = b                                        # 这里的if判断实际上就是union函数
                n -= 1

        return n

    def find(self, x, parent):
        if parent[x] == -1:
            return x
        parent[x] = self.find(parent[x], parent)                     # 路径压缩可以让find时间复杂度实际上等于O(1)
        return parent[x]

Java版本

class Solution {
    public int countComponents(int n, int[][] edges) {
        int[] parent = new int[n];
        Arrays.fill(parent, -1);

        for (int i = 0; i < edges.length; i++) {
            int start = edges[i][0];
            int end = edges[i][1];
            int a = find(start, parent);
            int b = find(end, parent);

            if (a != b) {
                parent[a] = b;
                n--;
            }
        }

        return n;
    }

    private int find(int node, int[] parent) {
        if (parent[node] == -1) {
            return node;
        }
        parent[node] = find(parent[node], parent);
        return parent[node];
    }
}

当然这道题也可以用DFS实现统计,下面是DFS代码

class Solution(object):
    def countComponents(self, n, edges):
        """
        :type n: int
        :type edges: List[List[int]]
        :rtype: int
        """
        store = {}
        color = [0] * n

        for st, ed in edges:
            store.setdefault(st, [])                               # 无向图两方都要统计
            store[st].append(ed)
            store.setdefault(ed, [])
            store[ed].append(st)

        result = 0
        for key in xrange(n):
            if key not in store:
                result += 1                                        # 没有在store里的都是孤点
                continue
            if not color[key]:                                     # 一次DFS将所属一个联通分量的所有点标色
                self.DFS(key, color, store)
                result += 1

        return result

    def DFS(self, key, color, store):
        color[key] = 1
        for node in store[key]:
            if node not in store:
                continue
            if not color[node]:
                self.DFS(node, color, store)

results matching ""

    No results matching ""