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]
i != j
for which dislikes[i] == dislikes[j]
.题目大意:从1到N将这堆数分成两个group,能否满足互相dislike的不分到同一个group里面。
二分图
public boolean possibleBipartition(int N, int[][] dislikes) {
List[] graph = new List[N];
for (int i = 0; i < graph.length; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 0; i < dislikes.length; i++) {
graph[ dislikes[i][0] - 1 ].add( dislikes[i][1] - 1 );
graph[ dislikes[i][1] - 1 ].add( dislikes[i][0] - 1 );
}
int[] colors = new int[N];
Arrays.fill(colors, -1);
for (int i = 0; i < N; i++){
if (colors[i] == -1 && !paint(colors, i, graph, 0)){
return false;
}
}
return true;
}
private boolean paint(int[] colors, int index, List[] graph, int color) {
colors[index] = color;
for (int i = 0; i < graph[index].size(); i++){
int nextIndex = graph[index].get(i);
if (colors[nextIndex] == color) {
return false;
} else if (colors[nextIndex] == -1 &&
!paint(colors, nextIndex, graph, 1 - color)) {
return false;
}
}
return true;
}