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
Constraints:
1 <= n <= 2000
0 <= dislikes.length <= 10000
dislikes[i].length == 2
1 <= dislikes[i][j] <= n
dislikes[i][0] < dislikes[i][1]
- There does not exist
i != j
for whichdislikes[i] == dislikes[j]
.
class Solution { public boolean possibleBipartition(int n, int[][] dis) { int[] visited = new int[n + 1]; List<Integer>[] graph = new ArrayList[n + 1]; for(int i = 0; i <= n; i++) graph[i] = new ArrayList(); for(int[] dislike: dis) { int fr = dislike[0], to = dislike[1]; graph[fr].add(to); graph[to].add(fr); } for(int i = 1; i <= n; i++) { if(visited[i] == 0 && graph[i].size() > 0) { visited[i] = 1; Queue<Integer> q = new LinkedList(); q.offer(i); while(!q.isEmpty()) { int cur = q.poll(); for(int j : graph[cur]) { if(visited[j] == 0) { visited[j] = (visited[cur] == 1 ? 2 : 1); q.offer(j); } else { if(visited[j] == visited[cur]) return false; } } } } } return true; } }
和785一样,但是得先建立graph,完了之后bfs涂色
class Solution { public boolean possibleBipartition(int N, int[][] dislikes) { Map<Integer, List<Integer>> map = new HashMap(); for(int[] dis : dislikes) { map.computeIfAbsent(dis[0], a -> new ArrayList()).add(dis[1]); map.computeIfAbsent(dis[1], a -> new ArrayList()).add(dis[0]); } int[] color = new int[N + 1]; for(int i = 1; i <= N; i++) { if(color[i] == 0) { color[i] = 1; Queue<Integer> q = new LinkedList(); q.offer(i); while(!q.isEmpty()) { int cur = q.poll(); if(map.containsKey(cur)) { for(int nei : map.get(cur)) { if(color[nei] == 0){ color[nei] = color[cur] == 1 ? 2 : 1; q.offer(nei); } else { if(color[nei] == color[cur]) return false; } } } } } } return true; } }