题:https://leetcode.com/problems/is-graph-bipartite/description/
题目
Given an undirected graph, return true if and only if it is bipartite.
Recall that a graph is bipartite if we can split it’s set of nodes into two independent subsets A and B such that every edge in the graph has one node in A and another node in B.
The graph is given in the following form: graph[i] is a list of indexes j for which the edge between nodes i and j exists. Each node is an integer between 0 and graph.length - 1. There are no self edges or parallel edges: graph[i] does not contain i, and it doesn’t contain any element twice.
Example 1:
Input: [[1,3], [0,2], [1,3], [0,2]]
Output: true
Explanation:
The graph looks like this:
0----1
| |
| |
3----2
We can divide the vertices into two groups: {0, 2} and {1, 3}.
Example 2:
Input: [[1,2,3], [0,2], [0,1,3], [0,2]]
Output: false
Explanation:
The graph looks like this:
0----1
| \ |
| \ |
3----2
We cannot find a way to divide the set of nodes into two independent subsets.
Note:
- graph will have length in range [1, 100].
- graph[i] will contain integers in range [0, graph.length - 1].
- graph[i] will not contain i or duplicate values.
- The graph is undirected: if any element j is in graph[i], then i will be in graph[j].
题目大意
判断图是否是 二分图。graph[i][j] ,i点与j点连接。
思路
染色法。
对每个未染色的点,对其相邻的点染色。
为染色的点 置为-1,遍历所有点,若该点未染色。
起始点染色为0,相邻点染色为1,再相邻的染色为0,以此循环下去。若遇到相邻的点已染色,但染色不符合预期 则返回 false。
若所有点均已染色,则返回true。
DFS 遍历相邻点
class Solution {
public boolean isBipartite(int[][] graph) {
int[] colors = new int[graph.length];
Arrays.fill(colors,-1);
for(int i = 0 ;i < graph.length; i++)
if(colors[i]==-1 && !isPartBipartite(i,0,colors,graph))
return false;
return true;
}
public boolean isPartBipartite(int curNode,int curColor,int [] colors,int [][]graph){
if(colors[curNode] != -1) return colors[curNode] == curColor;
colors[curNode] = curColor;
for(int j = 0 ; j < graph[curNode].length;j++)
if(!isPartBipartite(graph[curNode][j],1-curColor,colors,graph))
return false;
return true;
}
}
BFS 遍历相邻点
class Solution {
public boolean isBipartite(int[][] graph) {
int[] colors = new int[graph.length];
Arrays.fill(colors,-1);
Queue<Integer> queue = new LinkedList<>();
for(int i = 0 ;i < graph.length; i++)
if(colors[i]==-1){
queue.offer(i);
int curColor = 0;
while(!queue.isEmpty()){
int queueSize = queue.size();
for(int j = 0 ; j < queueSize ; j++){
int curNode = queue.poll();
if(colors[curNode]!=-1){
if(colors[curNode] != curColor)
return false;
continue;
}
colors[curNode] = curColor;
for(int k = 0 ;k < graph[curNode].length;k++)
queue.offer(graph[curNode][k]);
}
curColor = 1- curColor;
}
}
return true;
}
}