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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
class Solution {
// Option 1: Using Optional for clear success/failure indication
public Optional<List<List<Integer>>> divideTeams(Map<Integer, List<Integer>> enemies) {
if (enemies.isEmpty()) return Optional.of(Arrays.asList(new ArrayList<>(), new ArrayList<>()));
Map<Integer, Integer> colors = new HashMap<>();
Set<Integer> students = new HashSet<>();
// Get all students
for (Map.Entry<Integer, List<Integer>> entry : enemies.entrySet()) {
students.add(entry.getKey());
for (int enemy : entry.getValue()) {
students.add(enemy);
}
}
// Try to color the graph
for (int student : students) {
if (!colors.containsKey(student)) {
if (!dfs(student, 0, enemies, colors)) {
return Optional.empty(); // Clear indication of failure
}
}
}
// Build teams based on colors
List<Integer> team1 = new ArrayList<>();
List<Integer> team2 = new ArrayList<>();
for (int student : students) {
if (colors.get(student) == 0) {
team1.add(student);
} else {
team2.add(student);
}
}
return Optional.of(Arrays.asList(team1, team2));
}
// Option 2: Using custom result class
public static class DivisionResult {
public final boolean possible;
public final List<List<Integer>> teams;
public DivisionResult(boolean possible, List<List<Integer>> teams) {
this.possible = possible;
this.teams = teams;
}
}
public DivisionResult divideTeamsWithResult(Map<Integer, List<Integer>> enemies) {
if (enemies.isEmpty()) {
return new DivisionResult(true, Arrays.asList(new ArrayList<>(), new ArrayList<>()));
}
Map<Integer, Integer> colors = new HashMap<>();
Set<Integer> students = new HashSet<>();
// Get all students
for (Map.Entry<Integer, List<Integer>> entry : enemies.entrySet()) {
students.add(entry.getKey());
for (int enemy : entry.getValue()) {
students.add(enemy);
}
}
// Try to color the graph
for (int student : students) {
if (!colors.containsKey(student)) {
if (!dfs(student, 0, enemies, colors)) {
return new DivisionResult(false, new ArrayList<>()); // Clear failure
}
}
}
// Build teams based on colors
List<Integer> team1 = new ArrayList<>();
List<Integer> team2 = new ArrayList<>();
for (int student : students) {
if (colors.get(student) == 0) {
team1.add(student);
} else {
team2.add(student);
}
}
return new DivisionResult(true, Arrays.asList(team1, team2));
}
private boolean dfs(int node, int color, Map<Integer, List<Integer>> enemies,
Map<Integer, Integer> colors) {
colors.put(node, color);
if (enemies.containsKey(node)) {
for (int enemy : enemies.get(node)) {
if (!colors.containsKey(enemy)) {
if (!dfs(enemy, 1 - color, enemies, colors)) {
return false;
}
} else if (colors.get(enemy) == color) {
return false; // Conflict found
}
}
}
return true;
}
}
|