Leetcode - Possible Bipartition
https://leetcode.com/problems/possible-bipartition/
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]
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | func possibleBipartition(N int , dislikes [][] int ) bool { graph := make([][] int , N) for i := 0; i < N; i++ { graph[i] = make([] int , N) } for _, d := range dislikes { graph[d[0]-1][d[1]-1] = 1 graph[d[1]-1][d[0]-1] = 1 } group := make([] int , N) for i := 0; i < N; i++ { if group[i] == 0 && !dfs(graph, &group, i, 1) { return false } } return true } func dfs(graph [][] int , group *[] int , index, g int ) bool { (*group)[index] = g for i := 0; i < len(graph); i++ { if graph[index][i] == 1 { if (*group)[i] == g { return false } if (*group)[i] == 0 && !dfs(graph, group, i, 0 - g) { return false } } } return true } |