Leetcode: 785. Is Graph Bipartite?

这题目最一开始要做的事情就是,搞清楚什麽是bipartite?

一张图具有bipartite的性质的话,代表可以分成bi个party,然後里面的元素都可以跟对面party连紧紧(随意胡诌)。

可以把图里的node分成两个独立集合,独立集合也就是说两个交集没结果,然後可以全连接这样。
 
 
 

思路:

我只能感受到...边要偶数条边,还有图里面,一定会有复数个点,他们连到的点是相同的。

但还是没想法。

 
 

吸收知识时间

这题可以把她等价转换成涂色问题,bipartite还有一个性质,而且是解问题的关键:连线只在不同集合之间,同个集合的点是不会有连线的,所以可以在BFS中,把该点连接出去的邻居都涂上不同颜色,只要没有冲突,就继续涂色,直到把所有点分成不同颜色为止。
 
 
 

程序码

class Solution {
public:
    bool isBipartite(vector<vector<int>>& graph) {
        int n = graph.size();
        vector<int> color(n); // [0, 1, -1] = [uncolor, A, B] = [unvisited, 已分组, 已分组]
        
        queue<int> q;
        for (int i = 0; i < n; i++) {
            if (color[i]) continue;
            
            color[i] = 1;
            q.push(i);
            while(!q.empty()) {
                int curr_node = q.front();
                for (int neighbor: graph[curr_node]) {
                    if (!color[neighbor]) {
                        color[neighbor] = -color[curr_node];
                        q.push(neighbor);
                    }
                    else if (color[neighbor] == color[curr_node])
                        return false;
                }
                q.pop();
            }
        }
        return true;
  }
};

 
 

大神

for (q.push(i); !q.empty(); q.pop()) { 
    ... 
}

我从来..没试过把queue跟for结合,好厉害!

 
 
 

参考:
https://leetcode.com/problems/is-graph-bipartite/discuss/409594/Clean-C%2B%2B-BFS-with-explanation-and-comments
https://www.youtube.com/watch?v=oDqjPvD54Ss


<<:  # Day 21 Heterogeneous Memory Management (HMM) (一)

>>:  Swift 新手-iPhone 界面设计

Day29 资安小结 - 红队攻击流程与漏洞

上次我们讲到红队与蓝队,但其实还有紫队跟白队, 先介绍紫队,其实紫队是一个虚拟团队,通过红队与蓝队的...

虹语岚访仲夏夜-19(专业的小四篇)

如果可以  希望一年只想你一次 可惜  那有一天不想你 如果思念  是你身边空气 可不可以 让我也...

Components 与 Props(Day4)

当我们会写基本的 Hello World 之後,就可以开始考虑扩展跟重组我们要撰写的程序码了。我们会...

资料分析求职者面试经验:面试败北心得,准备多少才够?

资料分析面试 当时在海外申请资料分析职缺,所以参加的是视讯面试,一共参加了2轮面试,都在一天中完成。...

D18 第九周 (回忆篇)

这周还是在写第八周作业,加了一些小巧思,例如: javascript 程序码拆分到 html 之外 ...