123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- 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<Task> findCycle() {
- for (Task t: tasks) {
- if (t.tasksWhichDepend.size() != 0)
- continue;
-
- ArrayList<Task> 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<Task> starts = new ArrayList<>();
- ArrayList<Task> 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<Integer, TimeTasks> 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("");
- }
- }
- }
|