还得是 DFS、BFS遍历框架
见注释
class Solution {
private boolean ok = true;
private boolean[] color;
private boolean[] visited;
public boolean isBipartite(int[][] graph) {
int n = graph.length;
color = new boolean[n];
visited = new boolean[n];
//每个节点开始遍历
for(int v=0;v<n;v++){
if(!visited[v]){
//dfs(graph,v)
bfs(graph,v);
}
}
return ok;
}
}
/*
DFS
public void dfs(int[][] graph,int v){
//若已经判断非二分图,就直接结束该方法
if(!ok){
return;
}
//首先第一步就是将该点标记为已读
visited[v] = true;
//对该点所有相邻的点进行相反上色
for(int w : graph[v]){
//相邻节点没有被访问过
if(!visited[w]){
color[w] = !color[v];
dfs(graph,w);
}else{
//访问过的就判断是否为二分图
if(color[w] == color[v]){
ok = false;
}
}
}
}
*/
/*
bfs
private void bfs(int[][] graph,int start){
//使用队列
Queue<Integer> q = new LinkedList<>();
//将开头这个设置为true
visited[start] = true;
q.offer(start);
//若队列不为空或仍是一个二分图
while(!q.isEmpty() && ok){
//将队列中的节点依次出队进行操作
int v = q.poll();
//所有相邻的都进行染色或判断
for(int w:graph[v]){
if(!visited[w]){
color[w] = !color[v];
visited[w] = true;
//染色后入队
q.offer(w);
}else{
if(color[w] == color[v]){
ok= false;
}
}
}
}
}
*/