HàPhan 河

Possible Bipartition

Given a set of `N` people (numbered `1, 2, ..., N`), we would like to split everyone into two groups of any size.

Each person may dislike some other people, and they should not go into the same group.

Formally, if `dislikes[i] = [a, b]`, it means it is not allowed to put the people numbered `a` and `b` into the same group.

Return true if and only if it is possible to split everyone into two groups in this way.

Example 1:

``````Input: N = 4, dislikes = [[1,2],[1,3],[2,4]]
Output: true
Explanation: group1 [1,4], group2 [2,3]
``````

Example 2:

``````Input: N = 3, dislikes = [[1,2],[1,3],[2,3]]
Output: false
``````

Example 3:

``````Input: N = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]
Output: false
``````

Note:

• `1 <= N <= 2000`
• `0 <= dislikes.length <= 10000`
• `1 <= dislikes[i][j] <= N`
• `dislikes[i] < dislikes[i]`
• There does not exist `i != j` for which `dislikes[i] == dislikes[j]`.

## Solution

Build graph, use dfs

``````class Solution {
func possibleBipartition(_ N: Int, _ dislikes: [[Int]]) -> Bool {
var graph = [[Int]](repeating: [Int](repeating: 0, count: N + 1), count: N + 1)
for d in dislikes{
graph[d][d] = 1
graph[d][d] = 1
}
var colors = [Int](repeating: 0, count: N + 1)
for i in 1...N {
if colors[i] == 0 && !dfs(&graph, i, 1, &colors) { return false }
}
return true;
}

func dfs(_ graph: inout [[Int]], _ cIndex: Int, _ cColor: Int, _ colors: inout [Int]) -> Bool {
colors[cIndex] = cColor
for i in 0..<colors.count {
if graph[cIndex][i] == 1 {
if colors[i] == cColor {
return false
}
if colors[i] == 0 && !dfs(&graph, i, -cColor, &colors) {
return false
}
}
}
return true
}
}
``````