fork download
  1. import java.util.*;
  2.  
  3. enum Status {
  4. NOT_VISITED,
  5. VISITING,
  6. VISITED
  7. }
  8.  
  9. class ProjectScheduler {
  10. private Map<String, List<String>> adjList;
  11. private Map<String, Status> visitStatus;
  12.  
  13. public ProjectScheduler() {
  14. adjList = new HashMap<>();
  15. visitStatus = new HashMap<>();
  16. }
  17.  
  18. public void addTask(String task) {
  19. if (!adjList.containsKey(task)) {
  20. adjList.put(task, new ArrayList<>());
  21. }
  22. }
  23.  
  24. public void addDependency(String prerequisiteTask, String dependentTask) {
  25. addTask(prerequisiteTask); // Ensure both tasks exist
  26. addTask(dependentTask);
  27. adjList.get(prerequisiteTask).add(dependentTask);
  28. }
  29.  
  30. public List<String> getTaskOrder() {
  31. List<String> order = new ArrayList<>();
  32. visitStatus.clear(); // Reset visit status
  33. for (String task : adjList.keySet()) {
  34. visitStatus.putIfAbsent(task, Status.NOT_VISITED);
  35. }
  36.  
  37. boolean hasCycle = false;
  38. for (String task : adjList.keySet()) {
  39. if (visitStatus.get(task) == Status.NOT_VISITED) {
  40. if (dfs(task, order)) {
  41. hasCycle = true;
  42. break;
  43. }
  44. }
  45. }
  46.  
  47. if (hasCycle) {
  48. return new ArrayList<>(); // Return empty list if cycle detected
  49. }
  50.  
  51. Collections.reverse(order); // Reverse to get topological order
  52. return order;
  53. }
  54.  
  55. private boolean dfs(String task, List<String> order) {
  56. visitStatus.put(task, Status.VISITING); // Mark as visiting
  57. for (String neighbor : adjList.get(task)) {
  58. Status status = visitStatus.getOrDefault(neighbor, Status.NOT_VISITED);
  59. if (status == Status.VISITING) {
  60. return true; // Cycle detected
  61. } else if (status == Status.NOT_VISITED) {
  62. if (dfs(neighbor, order)) {
  63. return true;
  64. }
  65. }
  66. }
  67. visitStatus.put(task, Status.VISITED); // Mark as visited
  68. order.add(task); // Add to order (will be reversed later)
  69. return false;
  70. }
  71. }
  72.  
  73. class Main {
  74. public static void main(String[] args) {
  75. ProjectScheduler scheduler = new ProjectScheduler();
  76.  
  77. // Add tasks
  78. scheduler.addTask("Analisis");
  79. scheduler.addTask("Desain UI");
  80. scheduler.addTask("Coding Backend");
  81. scheduler.addTask("Testing");
  82. scheduler.addTask("Deploy");
  83.  
  84. // Add dependencies
  85. scheduler.addDependency("Analisis", "Desain UI");
  86. scheduler.addDependency("Analisis", "Coding Backend");
  87. scheduler.addDependency("Desain UI", "Testing");
  88. scheduler.addDependency("Coding Backend", "Testing");
  89. scheduler.addDependency("Testing", "Deploy");
  90.  
  91. // Get and print task order
  92. List<String> taskOrder = scheduler.getTaskOrder();
  93. if (taskOrder.isEmpty()) {
  94. System.out.println("Penjadwalan tidak mungkin karena terdapat siklus dependensi.");
  95. } else {
  96. System.out.println("Urutan pengerjaan tugas yang valid: " + taskOrder);
  97. }
  98. }
  99. }
Success #stdin #stdout 0.14s 57596KB
stdin
Standard input is empty
stdout
Urutan pengerjaan tugas yang valid: [Analisis, Coding Backend, Desain UI, Testing, Deploy]