785. 判斷二分圖
阿新 • • 發佈:2018-11-11
題目
給定一個無向圖graph,當這個圖為二分圖時返回true。
如果我們能將一個圖的節點集合分割成兩個獨立的子集A和B,並使圖中的每一條邊的兩個節點一個來自A集合,一個來自B集合,我們就將這個圖稱為二分圖。
graph將會以鄰接表方式給出,graph[i]表示圖中與節點i相連的所有節點。每個節點都是一個在0到graph.length-1之間的整數。這圖中沒有自環和平行邊: graph[i] 中不存在i,並且graph[i]中沒有重複的值。
示例 1:
輸入: [[1,3], [0,2], [1,3], [0,2]]
輸出: true
解釋:
無向圖如下:
0----1
| |
| |
3----2
我們可以將節點分成兩組: {0, 2} 和 {1, 3}。
示例 2:
輸入: [[1,2,3], [0,2], [0,1,3], [0,2]]
輸出: false
我們不能將節點分割成兩個獨立的子集。
思路
這個題可以看成一個染色問題,bfs或者dfs遍歷都可以,我採取bfs,用一個數組記錄下各個點的深度,當兩個點的深度奇偶性相同時,它們應該在同一個子集。
除此之外,還要注意圖不一定是連通的,選了一個點遍歷後,若還有點沒有被遍歷到,剩餘的點還要進行遍歷。
class Solution {
public:
bool isBipartite(vector<vector<int>>& graph) {
vector<bool> visited(graph.size() , false);
vector<int > pointArr;
vector<int > depth(graph.size() , -1);
for(int loop = 0 ; loop < visited.size() ; loop++){
int nowIndex = pointArr.size();
if(!visited[loop]){
visited[ loop] = true;
pointArr.push_back(loop);
depth[loop] = 0;
}
int nowLimit = pointArr.size();
while(nowIndex != pointArr.size()){
int nowPoint = pointArr[nowIndex++];
for(int loop1 = 0 ; loop1 < graph[nowPoint].size() ; loop1++){
if(!visited[graph[nowPoint][loop1] ]){
visited[graph[nowPoint][loop1] ] = true;
depth[graph[nowPoint][loop1] ] = depth[nowPoint] + 1;
pointArr.push_back(graph[nowPoint][loop1] );
}
else{
if(depth[nowPoint] % 2 == depth[graph[nowPoint][loop1] ] % 2 ){
return false;
}
}
}
}
}
return true;
}
};