Determine the critical path
GolfScript
A GolfScript solution - just because it can be done.
# Parse input
'['-']'%:I{[.1&lt;\2&gt;';'/(~\{','/{`{\1&lt;=}+I?I?}/}%0]}%

# Determine estart iteratively
{:A{[~{A=~@+\;\;}2$%+$-1=]}%.A=!}do

# Invert dependencies
A{~@+\;\;}%$-1=:M;
[.,,]zip{[~{\~\2=@?0&lt;{;}*}+[A.,,]zip%\:^~;;@^3=M]}%

# Determine lfinish iteratively
{:A{[~{A=~\;\;\-\;}3$%+$0=]}%.A=!}do

# Print results

# Formats numbers (right aligned, 7 chars)
{`&quot;       &quot;\+-7&gt;}:F; 

&quot; name | estart | efinish | lstart | lfinish | critical \n&quot;
&quot;------+--------+---------+--------+---------+----------\n&quot;
@{&quot;    &quot;\(&quot; |&quot;@.2=F&quot; | &quot;@.~;@+\;F&quot; |&quot;@.~\;\;\-F&quot; | &quot;@.3=F&quot; |        &quot;@~-\;+!&quot;NY&quot;1/=n}%

Example (online):
&gt; [A:15][B:7][C:9;A,B][D:3;B,C][E:5;C][F:11;D][G:4;D,E,F]

 name | estart | efinish | lstart | lfinish | critical 
------+--------+---------+--------+---------+----------
    A |      0 |      15 |      0 |      15 |        Y
    B |      0 |       7 |      8 |      15 |        N
    C |     15 |      24 |     15 |      24 |        Y
    D |     24 |      27 |     24 |      27 |        Y
    E |     24 |      29 |     33 |      38 |        N
    F |     27 |      38 |     27 |      38 |        Y
    G |     38 |      42 |     38 |      42 |        Y