二分图与染色算法

二分图的概念

二分图就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。

染色法概念

 

二分图算法也称为染色法。如果可以用两种颜色对图中的节点进行着色,并且保证相邻的节点(边两端的节点)颜色不同,那么图为二分。

下图中有相邻节点的颜色相同,因此不是二分图。

 

题目与解析

lc 785. 判断二分图

class Solution {
public:
    bool isBipartite(vector<vector<int>>& graph) {
        vector<int> color(graph.size(), -1);  // 各节点的着色情况,-1:未着色 0:颜色A,1:颜色B;
        stack<int> colorStack;  // 用于完成深度优先遍历的栈
        // 对图中的每个节点进行DFS,因为可能存在孤立点
        for (int i = 0; i < graph.size(); i++) {
            if (color[i] == -1) {
                colorStack.push(i);  
                color[i] = 0;
                // 对该点进行DFS
                while (!colorStack.empty()) {
                    // 将栈顶点出栈
                    int index = colorStack.top();
                    colorStack.pop();
                    // 对所有栈顶点的相邻节点判断
                    for (int j = 0; j < graph[index].size(); j++) {
                        if (color[graph[index][j]] == -1) {  // 若未着色
                            color[graph[index][j]] = color[index] ^ 1;
                            colorStack.push(graph[index][j]);  // 将着色正确的节点入栈
                        }
                        else { // 若着色
                            if (color[graph[index][j]] ^ color[index] == 0) {  // 若颜色相同
                                return false;
                            }
                        }
                    }
                }
            }
        }
        return true;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值