785. Is Graph Bipartite?

785. 二分图

Posted by bbkgl on July 16, 2020

人言落日是天涯

望极天涯不见家

唉,孤陋寡闻,第一次听到“染色”这个词。

简单来说,可以在深度遍历的过程中,依次将邻接点染成与自己相反的颜色。

在遍历的过程中,如果碰到已经被染色,但是和自己颜色一样的邻接点,就说明这个图无法被二分。

因为是深度遍历,同一个连通图在一次遍历中,都会被染色,所以每次深度遍历第一个结点的时候,任意颜色都可以的。

class Solution {
private:
    bool dfs(vector<vector<int>>& graph, int v, int8_t c, vector<int8_t> &colors) {
        if (colors[v] != 0) return true;
        colors[v] = c;
        for (int w : graph[v])
            if (colors[w] == c || !dfs(graph, w, -c, colors)) return false;
        return true;
    }

public:
    bool isBipartite(vector<vector<int>>& graph) {
        int n = graph.size();
        vector<int8_t> colors(n);
        for (int v = 0; v < n; v++) {
            if (!dfs(graph, v, 1, colors))
                return false;
        }
        return true;
    }
};