LeetCode 785. 判断二分图

匿名 (未验证) 提交于 2019-12-02 23:48:02

给定一个无向图graph,当这个图为二分图时返回true。

如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。


示例 1:
输入: [[1,3], [0,2], [1,3], [0,2]]
输出: true
解释:
无向图如下:
0----1


3----2
我们可以将节点分成两组: {0, 2} 和 {1, 3}。

示例 2:
输入: [[1,2,3], [0,2], [0,1,3], [0,2]]
输出: false
解释:
无向图如下:
0----1


3----2
我们不能将节点分割成两个独立的子集。
注意:

graph 的长度范围为 [1, 100]。
graph[i] 中的元素的范围为 [0, graph.length - 1]。
graph[i] 不会包含 i 或者有重复的值。
图是无向的: 如果j 在 graph[i]里边, 那么 i 也会在 graph[j]里边。

算法:BFS。

class Solution { public:     bool bfs(int k, vector<int>& s, vector<vector<int>>& g){         s[k]=0;         queue<int>q;         q.push(k);         while(q.size()){             int u=q.front();             q.pop();             for(auto v:g[u]){                 if(s[v]==s[u])                     return false;                 if(s[v]==-1){                     s[v]=1-s[u];                     q.push(v);                 }             }            }         return true;     }     bool isBipartite(vector<vector<int>>& g) {         int n=g.size();         vector<int>s(n,-1);         for(int i=0;i<n;i++){             if(s[i]==-1)             if(!bfs(i,s,g))                 return false;         }         return true;     } };

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!