import java.util.ArrayList; import java.util.TreeMap; import java.util.Scanner; import java.util.Arrays; import java.io.File; class Project { Task[] tasks; ArrayList findCycle() { for (Task t: tasks) { if (t.tasksWhichDepend.size() != 0) continue; ArrayList l = t.findCycle(); if (l != null) return l; } return null; } void readFile(File f) throws Exception { Scanner s = new Scanner(f); int nlines = Integer.parseInt(s.nextLine()); s.nextLine(); this.tasks = new Task[nlines]; int[][] taskDeps = new int[nlines][]; int n = 0; while (s.hasNextLine()) { String line = s.nextLine(); if (line.equals("")) continue; String[] parts = line.split("\\s+"); Task t = new Task(); // Set easy properties t.id = Integer.parseInt(parts[0]); t.name = parts[1].replace('-', ' '); t.time = Integer.parseInt(parts[2]); t.manpower = Integer.parseInt(parts[3]); // Remember all the IDs of the dependencies for // after all tasks are read taskDeps[t.id - 1] = new int[parts.length - 5]; for (int i = 4; i < parts.length - 1; ++i) { taskDeps[t.id - 1][i - 4] = Integer.parseInt(parts[i]); } this.tasks[t.id - 1] = t; n += 1; } if (n != nlines) { throw new Exception("Expected "+nlines+" lines, got "+n); } // Find dependencies from IDs, and add them to the tasks for (int i = 0; i < this.tasks.length; ++i) { int[] deps = taskDeps[i]; Task t = this.tasks[i]; t.deps = new Task[deps.length]; for (int j = 0; j < deps.length; ++j) { int depid = deps[j]; Task dep = this.tasks[depid - 1]; dep.tasksWhichDepend.add(t); t.deps[j] = dep; } } } void calcTimes() { for (Task t: this.tasks) { if (t.tasksWhichDepend.size() == 0 && t.earliestStart == -1) t.calcTimes(); } for (Task t: this.tasks) { t.calcLatestStart(); } } class TimeTasks { ArrayList starts = new ArrayList<>(); ArrayList ends = new ArrayList<>(); int time; TimeTasks(int time) { this.time = time; } } void printTimes(int manpower) { int maxTime = 0; for (Task t: this.tasks) { if (maxTime < t.earliestFinished) maxTime = t.earliestFinished; } // TreeMap because it keeps keys sorted TreeMap taskMap = new TreeMap<>(); for (Task t: this.tasks) { if (taskMap.get(t.earliestStart) == null) taskMap.put(t.earliestStart, new TimeTasks(t.earliestStart)); if (taskMap.get(t.earliestFinished) == null) taskMap.put(t.earliestFinished, new TimeTasks(t.earliestFinished)); taskMap.get(t.earliestStart).starts.add(t); taskMap.get(t.earliestFinished).ends.add(t); } for (Integer key: taskMap.keySet()) { TimeTasks tt = taskMap.get(key); System.out.println("\nTime: "+tt.time); for (Task t: tt.starts) { System.out.println( " "+ "Starting: "+ t.identify()); manpower -= t.manpower; } for (Task t: tt.ends) { System.out.println( " "+ "Finished: "+ t.identify()); manpower += t.manpower; } System.out.println( " "+ "Current manpower: "+ manpower); } System.out.println( "\n"+ "**** Shortest possible project execution is "+ maxTime+ ". ****"); } void printTasks() { for (Task t: this.tasks) { System.out.println(""); System.out.println("Task "+t.id+":"); System.out.println(" Name: "+t.name); System.out.println(" Time: "+t.time); System.out.println(" Manpower: "+t.manpower); System.out.println(" Slack: "+t.slack); System.out.println(" Earliest Start: "+t.earliestStart); System.out.println(" Latest Start: "+t.latestStart); System.out.print (" Tasks which depend:"); for (Task ts: t.tasksWhichDepend) { System.out.print(" "+ts.id); } System.out.println(""); } } }