[leetcode] Is Graph Bipartite?
阿新 • • 發佈:2018-12-14
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;
}
};