University stuff.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import java.util.ArrayList;
  2. import java.util.TreeMap;
  3. import java.util.Scanner;
  4. import java.util.Arrays;
  5. import java.io.File;
  6. class Project {
  7. Task[] tasks;
  8. ArrayList<Task> findCycle() {
  9. for (Task t: tasks) {
  10. if (t.tasksWhichDepend.size() != 0)
  11. continue;
  12. ArrayList<Task> l = t.findCycle();
  13. if (l != null)
  14. return l;
  15. }
  16. return null;
  17. }
  18. void readFile(File f) throws Exception {
  19. Scanner s = new Scanner(f);
  20. int nlines = Integer.parseInt(s.nextLine());
  21. s.nextLine();
  22. this.tasks = new Task[nlines];
  23. int[][] taskDeps = new int[nlines][];
  24. int n = 0;
  25. while (s.hasNextLine()) {
  26. String line = s.nextLine();
  27. if (line.equals("")) continue;
  28. String[] parts = line.split("\\s+");
  29. Task t = new Task();
  30. // Set easy properties
  31. t.id = Integer.parseInt(parts[0]);
  32. t.name = parts[1].replace('-', ' ');
  33. t.time = Integer.parseInt(parts[2]);
  34. t.manpower = Integer.parseInt(parts[3]);
  35. // Remember all the IDs of the dependencies for
  36. // after all tasks are read
  37. taskDeps[t.id - 1] = new int[parts.length - 5];
  38. for (int i = 4; i < parts.length - 1; ++i) {
  39. taskDeps[t.id - 1][i - 4] = Integer.parseInt(parts[i]);
  40. }
  41. this.tasks[t.id - 1] = t;
  42. n += 1;
  43. }
  44. if (n != nlines) {
  45. throw new Exception("Expected "+nlines+" lines, got "+n);
  46. }
  47. // Find dependencies from IDs, and add them to the tasks
  48. for (int i = 0; i < this.tasks.length; ++i) {
  49. int[] deps = taskDeps[i];
  50. Task t = this.tasks[i];
  51. t.deps = new Task[deps.length];
  52. for (int j = 0; j < deps.length; ++j) {
  53. int depid = deps[j];
  54. Task dep = this.tasks[depid - 1];
  55. dep.tasksWhichDepend.add(t);
  56. t.deps[j] = dep;
  57. }
  58. }
  59. }
  60. void calcTimes() {
  61. for (Task t: this.tasks) {
  62. if (t.tasksWhichDepend.size() == 0 && t.earliestStart == -1)
  63. t.calcTimes();
  64. }
  65. for (Task t: this.tasks) {
  66. t.calcLatestStart();
  67. }
  68. }
  69. class TimeTasks {
  70. ArrayList<Task> starts = new ArrayList<>();
  71. ArrayList<Task> ends = new ArrayList<>();
  72. int time;
  73. TimeTasks(int time) {
  74. this.time = time;
  75. }
  76. }
  77. void printTimes(int manpower) {
  78. int maxTime = 0;
  79. for (Task t: this.tasks) {
  80. if (maxTime < t.earliestFinished)
  81. maxTime = t.earliestFinished;
  82. }
  83. // TreeMap because it keeps keys sorted
  84. TreeMap<Integer, TimeTasks> taskMap = new TreeMap<>();
  85. for (Task t: this.tasks) {
  86. if (taskMap.get(t.earliestStart) == null)
  87. taskMap.put(t.earliestStart, new TimeTasks(t.earliestStart));
  88. if (taskMap.get(t.earliestFinished) == null)
  89. taskMap.put(t.earliestFinished, new TimeTasks(t.earliestFinished));
  90. taskMap.get(t.earliestStart).starts.add(t);
  91. taskMap.get(t.earliestFinished).ends.add(t);
  92. }
  93. for (Integer key: taskMap.keySet()) {
  94. TimeTasks tt = taskMap.get(key);
  95. System.out.println("\nTime: "+tt.time);
  96. for (Task t: tt.starts) {
  97. System.out.println(
  98. " "+
  99. "Starting: "+
  100. t.identify());
  101. manpower -= t.manpower;
  102. }
  103. for (Task t: tt.ends) {
  104. System.out.println(
  105. " "+
  106. "Finished: "+
  107. t.identify());
  108. manpower += t.manpower;
  109. }
  110. System.out.println(
  111. " "+
  112. "Current manpower: "+
  113. manpower);
  114. }
  115. System.out.println(
  116. "\n"+
  117. "**** Shortest possible project execution is "+
  118. maxTime+
  119. ". ****");
  120. }
  121. void printTasks() {
  122. for (Task t: this.tasks) {
  123. System.out.println("");
  124. System.out.println("Task "+t.id+":");
  125. System.out.println(" Name: "+t.name);
  126. System.out.println(" Time: "+t.time);
  127. System.out.println(" Manpower: "+t.manpower);
  128. System.out.println(" Slack: "+t.slack);
  129. System.out.println(" Earliest Start: "+t.earliestStart);
  130. System.out.println(" Latest Start: "+t.latestStart);
  131. System.out.print (" Tasks which depend:");
  132. for (Task ts: t.tasksWhichDepend) {
  133. System.out.print(" "+ts.id);
  134. }
  135. System.out.println("");
  136. }
  137. }
  138. }