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][0] < dislikes[i][1]
- There does not exist
i != j
for whichdislikes[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[0]][d[1]] = 1
graph[d[1]][d[0]] = 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
}
}