存在一个 无向图 ,图中有 n 个节点。其中每个节点都有一个介于 0 到 n - 1 之间的唯一编号。给你一个二维数组 graph ,其中 graph[u] 是一个节点数组,由节点 u 的邻接节点组成。形式上,对于 graph[u] 中的每个 v ,都存在一条位于节点 u 和节点 v 之间的无向边。该无向图同时具有以下属性:
不存在自环(graph[u] 不包含 u)。
不存在平行边(graph[u] 不包含重复值)。
如果 v 在 graph[u] 内,那么 u 也应该在 graph[v] 内(该图是无向图)
这个图可能不是连通图,也就是说两个节点 u 和 v 之间可能不存在一条连通彼此的路径。
二分图 定义:如果能将一个图的节点集合分割成两个独立的子集 A 和 B ,并使图中的每一条边的两个节点一个来自 A 集合,一个来自 B 集合,就将这个图称为 二分图 。如果图是二分图,返回 true ;否则,返回 false 。
示例 1:
输入:graph = [[1,2,3],[0,2],[0,1,3],[0,2]]
输出:false
解释:不能将节点分割成两个独立的子集,以使每条边都连通一个子集中的一个节点与另一个子集中的一个节点。
示例 2:
输入:graph = [[1,3],[0,2],[1,3],[0,2]]
输出:true
解释:可以将节点分成两组: {0, 2} 和 {1, 3} 。
具体链接https://leetcode.cn/problems/is-graph-bipartite/
这里要判断给定的无向无环(且不一定联通)图是否为二分图,最简单的思想是:
遍历每个节点,如果该节点未染色(染色用1或-1代替),则以该节点为起点,广搜一下它所在的连通块,如果发现某两个相连的点的颜色一样,则判断为非二分图
int color[105]={0};
bool isBipartite(vector<vector<int>>& graph) {
queue<int>q;
for(int i=0;i<graph.size();i++) //遍历是因为图可能非连通
{
if(color[i]!=0)continue;
else{
q.push(i);color[i]=1;
while(!q.empty())
{
int temp=q.front();
for(int i=0;i<graph[temp].size();i++)//遍历该节点联通的所有节点
{
if(color[graph[temp][i]]==0)//未染色则进行染色
{
q.push(graph[temp][i]);
color[graph[temp][i]]=-color[temp];
}
else if(color[graph[temp][i]]==color[temp])return false;//染色后不符合要求了
}
q.pop();
}
}
}
return true;
}