1. 程式人生 > >[leetcode] Is Graph Bipartite?

[leetcode] Is Graph Bipartite?

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.

Solution: 對每個節點染色,如果相鄰兩個節點顏色相同,則不能。反之,則能。

class Solution {
public:
    bool isBipartite(vector<vector<int>>& graph) {
        int color[graph.size()];
        int visitedNode[graph.size()];
        int size,
index; for (int i=0; i<graph.size(); ++i) { color[i] = -1; } for (int i=0; i<graph.size(); ++i) { if (color[i] == -1) { visitedNode[0] = i; color[i] = 1; index = 0; size = 1; while (index < size) { int currentNode = visitedNode[index]; ++index; for (int j=0; j<graph[currentNode].size(); ++j) { if (color[graph[currentNode][j]] == -1) { visitedNode[size] = graph[currentNode][j]; ++size; color[graph[currentNode][j]] = !color[currentNode]; } else if (color[graph[currentNode][j]] == color[currentNode]) { return false; } } } } } return true; } };