886. Possible Bipartition
Содержание
Условие задачи
Дан набор из Nлюдей (все пронумерованы 1,2, … , N), мы хотим разделить этих людей на две группы.
Каждый человек может не любить другого человека, и такие люди долджны быть в разных группах.
dislikes[i] = [a, b] – означатет что нельзя человека aи b поместить в одну группу.
Необходимо вернуть true если такое разбиение возможно.
пример 1
Input: N = 4, dislikes = [[1,2],[1,3],[2,4]]
Output: true
Explanation: group1 [1,4], group2 [2,3]пример 2
Input: N = 3, dislikes = [[1,2],[1,3],[2,3]]
Output: falseпример 3
Input: N = 5, dislikes = [[1,2],[2,3],[3,4],[4,5],[1,5]]
Output: falseпример 4
Input: N = 10, dislikes = [[4,7],[4,8],[5,6],[1,6],[3,7],[2,5],[5,8],[1,2],[4,9],[6,10],[8,10],[3,6],[2,10],[9,10],[3,9],[2,3],[1,9],[4,6],[5,7],[3,8],[1,8],[1,7],[2,4]]
Output: trueОграничения
- 1 <=
N<= 2000 - 0 <=
dislikes.length<= 10000 - 1 <=
dislikes[i][j]<= N dislikes[i][0] < dislikes[i][1]- There does not exist
i != jfor whichdislikes[i] == dislikes[j].
Решение
Hash map + DFS
Создаем мапу, где ключом будет id человека,а значение – массив людей, котороые ему не нравятся.
Обойдем весь массив дизлайков и запишем дизлайки в мапу, но запишем в каждую сторонут, то есть когда мы встретим дизлайк [3,5] - мы запишем, что третьему не нравится пятый , и что пятому не нравится третий. ( то есть m[3]=[...,5,...] и m[5]=[...,3,...]).
И дальше поиск в глубину
func possibleBipartition(N int, dislikes [][]int) bool {
m := make(map[int][]int, N+1)
c := make(map[int]int, N+1)
for idx := range dislikes {
if _, ok := m[dislikes[idx][0]]; !ok {
m[dislikes[idx][0]] = make([]int, 0)
}
m[dislikes[idx][0]] = append(m[dislikes[idx][0]], dislikes[idx][1])
m[dislikes[idx][1]] = append(m[dislikes[idx][1]], dislikes[idx][0])
}
for idx := range m {
if _, ok := c[idx]; !ok && !clr(m, c, idx, 0) {
return false
}
}
return true
}
func clr(m map[int][]int, c map[int]int, i, color int) bool {
if _, ok := c[i]; ok {
return c[i] == color
}
c[i] = color
for idx := range m[i] {
if !clr(m, c, m[i][idx], color^1) {
return false
}
}
return true
}