leetcode785——Is Graph Bipartite?

题目大意:给出无向图的邻接表,判断它是不是二分图

分析:二分图就是图中的每条边的两个端点分别在两个不同的点集中。我们使用染色法判断一个图是否是二分图。初始化每个点未染色时颜色为0,然后两个点集中的点颜色分别染成1和-1。对图中没有染过色的点dfs进行染色,如果在dfs染色过程中发现已经染色的点和它当前正要被染的颜色不一致,则返回false。bfs也同样能做。

代码:

方法一:dfs

class Solution {

public:
    bool isBipartite(vector>& graph) {
        vector colors(graph.size());  //染色数组
        for(int i = 0;i < graph.size();i++){
            if(colors[i] == 0 && !dfs(graph,colors,i,1))  //给没染色的点尝试染色
                return false;
        }
        return true;
    }
    bool dfs(vector>& graph,vector& colors,int i,int color){
        if(colors[i]) return colors[i] == color;  //染色矛盾
        colors[i] = color;
        for(auto next : graph[i]){
            if(!dfs(graph,colors,next,-1*color))
                return false;
        }
        return true;
    }
};

方法二:bfs转载自https://www.cnblogs.com/grandyang/p/8519566.html

class Solution {
public:
    bool isBipartite(vector>& graph) {
        vector colors(graph.size());
        for (int i = 0; i < graph.size(); ++i) {
            if (colors[i] != 0) continue;
            colors[i] = 1;
            queue q{{i}};
            while (!q.empty()) {
                int t = q.front(); q.pop();
                for (auto a : graph[t]) {
                    if (colors[a] == 0) {
                        colors[a] = -1 * colors[t];
                        q.push(a);
                    } else {
                        if (colors[a] == colors[t]) return false;
                    }
                }
            }
        }
        return true;
    }
};

你可能感兴趣的:(图论)