LeetCode785. 判断二分图
程序员文章站
2022-04-16 15:41:07
题目给定一个无向图graph,当这个图为二分图时返回true。如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。链接思路一开始没读懂题。。他这个邻接表有点意思,一共graph....
题目
给定一个无向图graph,当这个图为二分图时返回true。
如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。
graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。链接
思路
一开始没读懂题。。他这个邻接表有点意思,一共graph.length
个节点,每个下标代表一个节点,即[0,graph.length-1]
,graph[i]
是一个数组,存放的是与节点i
之间有边的元素。没啥思路,看了题解,染色方法解决,可以dfs或者bfs。
class Solution {
final static int RED = 1;
final static int GREEN = 2;
int [] colors;
/*bfs*/
public boolean isBipartite(int[][] graph) {
int num = graph.length;
colors = new int[num];
//从第一个节点开始
for(int i = 0; i < num; i++){
//遇到未染色的节点才开始bfs搜索
if(colors[i] == 0){
//未染色的都染为红色
colors[i] = RED;
Queue<Integer> queue = new LinkedList<>();
//从i开始bfs
queue.offer(i);
while(!queue.isEmpty()){
int curNode = queue.poll();
int color = colors[curNode];
//对其邻居进行染色
for(int neighbor: graph[curNode]){
//邻居未染色color为0,需要染上与curNode不同的颜色
if(colors[neighbor] == 0){
colors[neighbor] = color == RED ? GREEN : RED;
queue.offer(neighbor);
}//邻居染色了,若与curNode颜色相同直接返回
else if(colors[neighbor] == color){
return false;
}
}
}
}
}
return true;
}
}
class Solution {
final static int RED = 1;
final static int GREEN = 2;
int [] colors;
boolean valid = true;
/*dfs*/
public boolean isBipartite(int[][] graph) {
int num = graph.length;
colors = new int[num];
for(int i = 0; i < num; i++){
if(colors[i] == 0){
dfs(graph, i, RED);
}
}
return valid;
}
void dfs(int[][] graph, int curNode, int color){
if(!valid){
return;
}
colors[curNode] = color;
int neighborColor = color == RED ? GREEN : RED;
for(int neighbor: graph[curNode]){
if(colors[neighbor] == 0){
dfs(graph, neighbor, neighborColor);
}else if(colors[neighbor] != neighborColor){
valid = false;
return;
}
}
}
}
本文地址:https://blog.csdn.net/qq_42007742/article/details/107378819