一、什么是二分图
若无向图 G=(V,E)G=(V,E) 的顶点集 VV 可以分割为两个互不相交的子集,且图中每条边的两个顶点分别属于不同的子集,则称图 GG 为一个二分图。
一个图是二分图,等价于能对这个图进行二染色,即用DFS或者BFS遍历时,相邻节点染成不同颜色。如果可行,那么就可以二分,如果不可行,那么就不能二分。
DFS写法,注意由于可能存在孤立连通区域,因此需要满足联通性要求。
class Solution {
public:
vector<int> colour;
bool isBipartite(vector<vector<int>>& graph) {
int n = graph.size();
colour = vector<int>(n, -1);
for(int i = 0; i < n; i++){
if(colour[i] == -1){
if(!dfs(graph, i, 0)){
return false;
}
}
}
return true;
}
bool dfs(vector<vector<int>>& graph, int index, int c) {
colour[index] = c;
for(auto v : graph[index]){
if(colour[v] == -1){
if(!dfs(graph, v, !c)){
return false;
}
}else if(colour[v] == c){
return false;
}
}
return true;
}
};
BFS写法,注意还是要对所有节点都遍历一遍
class Solution {
public:
vector<int> color;
bool isBipartite(vector<vector<int>>& graph) {
int n = graph.size();
color.resize(n);
queue<int> q;
for(int i = 0; i < n; i++){
if(color[i]){
continue;
}
q.push(i);
color[i] = 1;
while(!q.empty()){
auto u = q.front();
q.pop();
for(auto v : graph[u]){
if(color[v] == 0 ){
color[v] = - color[u];
q.push(v);
}else if(color[v] == color[u]){
return false;
}
}
}
}
return true;
}
};