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 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[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
}
}
```