⭐ 886. Possible Bipartition

Medium
We want to split a group of n people (labeled from 1 to n) into two groups of any size. Each person may dislike some other people, and they should not go into the same group.
Given the integer n and the array dislikes where dislikes[i] = [ai, bi] indicates that the person labeled ai does not like the person labeled bi, return true 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] and 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
Constraints:
  • 1 <= n <= 2000
  • 0 <= dislikes.length <= 10^4
  • dislikes[i].length == 2
  • 1 <= dislikes[i][j] <= n
  • ai < bi
  • All the pairs of dislikes are unique.

解題

var colorMap map[int]int
var edges map[int][]int
​
func possibleBipartition(n int, dislikes [][]int) bool {
colorMap = make(map[int]int)
edges = make(map[int][]int)
for _, dislike:= range dislikes{ // 記錄每個點討厭哪些點,應該不同色
edges[dislike[0]]=append(edges[dislike[0]], dislike[1])
edges[dislike[1]]=append(edges[dislike[1]], dislike[0])
}
for node:= 1; node <= n; node++{
if _, ok:= colorMap[node]; !ok{ //還沒塗過顏色
if !dfs(node, 1){
return false
}
}
}
return true
}
​
func dfs(node int, color int) bool{
if val, ok:= colorMap[node]; ok{
return val==color // 顏色不同
}else{
colorMap[node]=color //還沒塗色,塗色
}
for _, n:= range edges[node]{
if !dfs(n, -color){ // node討厭的人顏色應該是 -color
return false
}
}
return true
}
​