1. 程式人生 > >785. 判斷二分圖

785. 判斷二分圖

題目

給定一個無向圖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; } };