https://www.jianshu.com/p/2226dbe98e06
dfs思路,用一个stack,将某一个节点进栈push(),while(!stack.empty()),将stack中的节点出栈pop(),如果该节点有邻接节点,则再将邻接节点进栈。
bfs思路,用一个队列queue,将某个节点进入队列offer(), while (!queue.isEmpty()), 将queue中的节点出队列poll(),如果该节点有邻接节点,则再将邻接节点进入队列offer()。
class Solution {
public boolean isBipartite(int[][] graph) {
//思路:DFS: 依次染相反的颜色, 如果节点之前被染过色, 那么查看是否有冲突, 有冲突就返回False
//栈 DFS
Stack<Integer> stack = new Stack<>();
int[] color = new int[graph.length];
Arrays.fill(color, 0);//默认未被访问过
for(int i = 0; i < graph.length; i++){
//若未被访问过, 则染色并进栈
if(color[i] == 0){
color[i] = 1;
stack.push(i);
while(!stack.empty()){
int cur = stack.pop();
//如果当前节点的邻接节点未被访问过,则进行染色
for(int neighbour: graph[cur]){
if(color[neighbour] == 0){
color[neighbour] = -color[cur];//染不同的颜色
stack.push(neighbour);
}
else{
if(color[neighbour] != -color[cur]){//若染的颜色不是相反的
return false;
}
}
}
}
}
}
return true;
}
}