题目描述
题目分析
- 给定的数组的意思就是,对于示例一,就是说
graph[0]
有两个边,一个是0-1
,一个是0-3
;graph[1]
的两个边就是1-0
和1-2
- 题目最后的注意表明
graph[i]
不会包含i
或者是重复值,且数组是对称的 - 以矩阵的形式表示
示例一
中的graph
数组
- 题目中表示,如果是二分图,则每一个边的两个点都是来自不同的集合,那么在示例二中,从
graph[0]
来看,可以分成{0}
和{1,2,3}
两个子集,但是在graph[1]
中,就不可以这样分了,所以示例二不是二分图。
解法分析
- 一种是暴力解法,先根据第
0
个点,将其拆分成两个子集,然后继续逐个遍历,观察子集是否还会发生变化,一旦发生了变化,那么就可以返回false
- 其实这道题本质上就是将点分成两个集合,而且是相邻的点是属于不同的集合里面的,类似于
涂色问题
,将相邻的色块涂成不同的颜色,再规定颜色的种类只有两种,如果有解则返回true
,没有则返回false
代码
class Solution {
public boolean isBipartite(int[][] graph) {
int[] visited = new int[graph.length];
for(int i = 0; i<graph.length; i++){
if(visited[i] == 0 && !dfs(graph, visited, 1, i)){
return false;
}
}
return true;
}
public boolean dfs(int[][] graph, int[] visited, int color, int node){
if(visited[node] != 0) return visited[node] == color;
visited[node] = color;
for(int i : graph[node]){
if (!dfs(graph, visited, -color, i)) return false;
}
return true;
}
}