⭐ 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
    
}

Last updated