import java.util.*;
enum Status {
NOT_VISITED,
VISITING,
VISITED
}
class ProjectScheduler {
private Map
<String, List
<String
>> adjList
; private Map
<String, Status
> visitStatus
;
public ProjectScheduler() {
adjList = new HashMap<>();
visitStatus = new HashMap<>();
}
public void addTask
(String task
) { if (!adjList.containsKey(task)) {
adjList.put(task, new ArrayList<>());
}
}
public void addDependency
(String prerequisiteTask,
String dependentTask
) { addTask(prerequisiteTask); // Ensure both tasks exist
addTask(dependentTask);
adjList.get(prerequisiteTask).add(dependentTask);
}
public List<String> getTaskOrder() {
List<String> order = new ArrayList<>();
visitStatus.clear(); // Reset visit status
for (String task
: adjList.
keySet()) { visitStatus.putIfAbsent(task, Status.NOT_VISITED);
}
boolean hasCycle = false;
for (String task
: adjList.
keySet()) { if (visitStatus.get(task) == Status.NOT_VISITED) {
if (dfs(task, order)) {
hasCycle = true;
break;
}
}
}
if (hasCycle) {
return new ArrayList<>(); // Return empty list if cycle detected
}
Collections.
reverse(order
); // Reverse to get topological order return order;
}
private boolean dfs
(String task, List
<String
> order
) { visitStatus.put(task, Status.VISITING); // Mark as visiting
for (String neighbor
: adjList.
get(task
)) { Status status = visitStatus.getOrDefault(neighbor, Status.NOT_VISITED);
if (status == Status.VISITING) {
return true; // Cycle detected
} else if (status == Status.NOT_VISITED) {
if (dfs(neighbor, order)) {
return true;
}
}
}
visitStatus.put(task, Status.VISITED); // Mark as visited
order.add(task); // Add to order (will be reversed later)
return false;
}
}
class Main {
public static void main
(String[] args
) { ProjectScheduler scheduler = new ProjectScheduler();
// Add tasks
scheduler.addTask("Analisis");
scheduler.addTask("Desain UI");
scheduler.addTask("Coding Backend");
scheduler.addTask("Testing");
scheduler.addTask("Deploy");
// Add dependencies
scheduler.addDependency("Analisis", "Desain UI");
scheduler.addDependency("Analisis", "Coding Backend");
scheduler.addDependency("Desain UI", "Testing");
scheduler.addDependency("Coding Backend", "Testing");
scheduler.addDependency("Testing", "Deploy");
// Get and print task order
List<String> taskOrder = scheduler.getTaskOrder();
if (taskOrder.isEmpty()) {
System.
out.
println("Penjadwalan tidak mungkin karena terdapat siklus dependensi."); } else {
System.
out.
println("Urutan pengerjaan tugas yang valid: " + taskOrder
); }
}
}