/** ********************* * Critical path. Net validity checks such as loop check not implemented. The * source should be 0 and the destination should be n-1. * * @return The node sequence of the path. ********************* */ publicboolean[] criticalPath() { // One more value to save simple computation. int tempValue;
// Step 1. The in-degree of each node. int[] tempInDegrees = newint[numNodes]; for (inti=0; i < numNodes; i++) { for (intj=0; j < numNodes; j++) { if (weightMatrix.getValue(i, j) != -1) { tempInDegrees[j]++; } // Of if } // Of for j } // Of for i System.out.println("In-degree of nodes: " + Arrays.toString(tempInDegrees));
// Step 2. Topology sorting. int[] tempEarliestTimeArray = newint[numNodes]; for (inti=0; i < numNodes; i++) { // This node cannot be removed. if (tempInDegrees[i] > 0) { continue; } // Of if
System.out.println("Removing " + i);
for (intj=0; j < numNodes; j++) { if (weightMatrix.getValue(i, j) != -1) { tempValue = tempEarliestTimeArray[i] + weightMatrix.getValue(i, j); if (tempEarliestTimeArray[j] < tempValue) { tempEarliestTimeArray[j] = tempValue; } // Of if tempInDegrees[j]--; } // Of if } // Of for j } // Of for i
// Step 3. The out-degree of each node. int[] tempOutDegrees = newint[numNodes]; for (inti=0; i < numNodes; i++) { for (intj=0; j < numNodes; j++) { if (weightMatrix.getValue(i, j) != -1) { tempOutDegrees[i]++; } // Of if } // Of for j } // Of for i System.out.println("Out-degree of nodes: " + Arrays.toString(tempOutDegrees));
// Step 4. Reverse topology sorting. int[] tempLatestTimeArray = newint[numNodes]; for (inti=0; i < numNodes; i++) { tempLatestTimeArray[i] = tempEarliestTimeArray[numNodes - 1]; } // Of for i
for (inti= numNodes - 1; i >= 0; i--) { // This node cannot be removed. if (tempOutDegrees[i] > 0) { continue; } // Of if
System.out.println("Removing " + i);
for (intj=0; j < numNodes; j++) { if (weightMatrix.getValue(j, i) != -1) { tempValue = tempLatestTimeArray[i] - weightMatrix.getValue(j, i); if (tempLatestTimeArray[j] > tempValue) { tempLatestTimeArray[j] = tempValue; } // Of if tempOutDegrees[j]--; System.out.println("The out-degree of " + j + " decreases by 1."); } // Of if } // Of for j } // Of for i
boolean[] resultCriticalArray = newboolean[numNodes]; for (inti=0; i < numNodes; i++) { if (tempEarliestTimeArray[i] == tempLatestTimeArray[i]) { resultCriticalArray[i] = true; } // Of if } // Of for i
System.out.println("Critical array: " + Arrays.toString(resultCriticalArray)); System.out.print("Critical nodes: "); for (inti=0; i < numNodes; i++) { if (resultCriticalArray[i]) { System.out.print(" " + i); } // Of if } // Of for i System.out.println();