Project Network

Project management represents a project as a network of activities and events, used to schedule and analyze the project’s timeline.

A project completes only when every activity finishes. Since activities have predecessors, the project duration is bounded by its slowest chain of dependent activities, the path from initial to final event with the largest sum of durations.

Activity

A task consuming time and resources. Represented as an arrow between 2 events.

Predecessor

An activity that must finish before another can start.

Successor

An activity that cannot start until another finishes.

Chain

A sequence of activities in which each is a predecessor of the next.

Dummy Activity

Consumes 0 time and resources. Added only to preserve correct precedence when 2 activities share the same start and end events, or to represent a precedence relationship the diagram couldn’t otherwise express.

Logical Dummy

A dummy activity that represents a precedence relationship between activities. It shows that one activity must finish before another can start, without implying any additional activity.

Identity Dummy

A dummy activity that distinguishes activities with the same start and end events. It preserves the rule that no 2 activities can share both events.

Event

An instantaneous point in time marking the start or completion of one or more activities. Represented as a node.

An event isn’t a task and consumes no time or resources itself. It’s a milestone: the moment every activity ending there has finished, so every activity starting there is now free to begin.

Incoming Activity

An activity ending at that event.

Outgoing Activity

An activity starting at that event.

Network Construction Rules

  • Every activity has exactly one start and one end event.
  • No 2 activities can share both the same start and end event (use a dummy activity to separate them).
  • The network must have no cycles: an event can’t depend on an activity that (directly or indirectly) depends on it.

Critical Path Method

Critical Path Method finds that duration, and identifies the activities on that slowest chain.

Course Scope

Network analysis is treated through the LP approach in this course. Dijkstra’s algorithm was not covered in class.

Earliest Start Time

ESijES_{ij} is the largest total duration of any chain that ends at a predecessor of (i,j)(i,j), or 00 if (i,j)(i,j) has no predecessors.

Earliest Finish Time

EFij=ESij+tijEF_{ij} = ES_{ij} + t_{ij}, the earliest time activity (i,j)(i,j) can end.

When 2 activities affect the start of a milestone, the milestone’s earliest start time is the maximum of the 2 incoming early finish times. Reordering a dummy arrow can change an intermediate milestone value without changing the actual activity’s early finish time or the total project duration.

Latest Start Time

LSij=LFij−tijLS_{ij} = LF_{ij} - t_{ij}, the latest time activity (i,j)(i,j) can begin without delaying the project.

Latest Finish Time

LFijLF_{ij} is the project duration minus the largest total duration of any chain that starts at a successor of (i,j)(i,j), or the project duration if (i,j)(i,j) has no successors.

Project Duration

The largest total duration of any chain of activities. Every activity on that chain must finish in sequence before the project ends.

Critical Path

The chain of activities from the initial to the final event in which every activity has total float 00. Delaying any activity on the critical path delays the entire project.

Every activity still has to complete for the project to finish, not only the ones on the critical path. An activity off the critical path has slack, room to start later or take longer without pushing the project duration past what the critical path already fixes.

Steps

  1. Forward pass
    Compute ESES and EFEF for every activity, from the first activity to the last.
  2. Backward pass
    Compute LFLF and LSLS for every activity, from the last activity back to the first. Each LSLS uses its own LFLF, so no step needs a value that is computed later.
  3. Project duration is the largest EFEF.
  4. Critical path
    The activities with total float 00.

Float

The slack in an activity’s schedule, how much it can be delayed without consequence. 0 for every activity on the critical path.

For an activity (i,j)(i,j) starting at event ii and ending at event jj, with duration tijt_{ij}:

Total Float

Total float=LFij−EFij=LSij−ESij\text{Total float} = LF_{ij} - EF_{ij} = LS_{ij} - ES_{ij}

How much an activity can be delayed without delaying the project’s completion. Delaying it by more than its total float may still delay other activities.

Free Float

Free float=min⁡sESs−EFij\text{Free float} = \min_{s} ES_{s} - EF_{ij}

Here ss ranges over the successors of (i,j)(i,j). If (i,j)(i,j) has no successors, use the project duration in place of min⁡sESs\min_{s} ES_{s}.

How much an activity can be delayed without delaying the earliest start of any following activity.

Independent Float

Independent float=max⁡(min⁡sESs−min⁡kLSk−tij, 0)\text{Independent float} = \max\Big(\min_{s} ES_{s} - \min_{k} LS_{k} - t_{ij},\ 0\Big)

Here ss ranges over the successors of (i,j)(i,j), and kk ranges over every activity starting at event ii. Use the project duration in place of min⁡sESs\min_{s} ES_{s} if (i,j)(i,j) has no successors.

How much an activity can be delayed without affecting any preceding or following activity’s float. Negative values are treated as 0.

Independent float≤Free float≤Total float\text{Independent float} \le \text{Free float} \le \text{Total float}

Worked Example

A project has 6 activities. The table gives the duration and predecessors of each activity.

ActivityDurationPredecessor
AA4none
BB3none
CC2AA
EE5BB
FF3BB, CC
GG4EE

Construct the network from the table, one activity at a time, then compute the earliest and latest times of every activity and the floats.

Solution Reveal Hide
1 /

A, 4 1 2

AA runs from event 1 to event 2, duration 44.

A, 4 B, 3 1 2 3

BB runs from event 1 to event 3, duration 33.

A, 4 B, 3 C, 2 1 2 3 4

CC runs from event 2 to event 4, duration 22. It starts only after AA finishes.

A, 4 B, 3 C, 2 D, 0 1 2 3 4

DD runs from event 3 to event 4, duration 00. It consumes no time or resources.

A, 4 B, 3 C, 2 D, 0 E, 5 1 2 3 4 5

EE runs from event 3 to event 5, duration 55.

A, 4 B, 3 C, 2 D, 0 E, 5 F, 3 1 2 3 4 5 6

FF runs from event 4 to event 6, duration 33. Its predecessors are CC and DD.

FF depends on both BB and CC, but BB‘s arrow already ends at event 3, where EE starts, and an activity can only have one end event. Merging events 3 and 4 would make EE depend on CC too. The dummy DD makes FF wait for BB without making EE wait for CC.

A, 4 B, 3 C, 2 D, 0 E, 5 F, 3 G, 4 1 2 3 4 5 6

GG runs from event 5 to event 6, duration 44. The network is complete.

Each event gets 2 squares above it. The left square holds the earliest finish time (EFEF), and the right square the latest finish time, LFLF.

The forward pass fills EFEF from event 1 to event 6, EFj=max⁡i(EFi+tij)EF_j = \max_i (EF_i + t_{ij}) over the activities i→ji \to j entering event jj. The backward pass fills LFLF from event 6 back to event 1, LFi=min⁡j(LFj−tij)LF_i = \min_j (LF_j - t_{ij}) over the activities i→ji \to j leaving event ii.

1 /

A (4) B (3) C (2) D (0) E (5) F (3) G (4) 1 2 3 4 5 6 EF 0 LF EF 4 LF EF 3 LF

Event 1 has no predecessors, so EF1=0EF_1 = 0. Each of events 2 and 3 has a single incoming activity from event 1, so EF2=0+4=4EF_2 = 0 + 4 = 4 and EF3=0+3=3EF_3 = 0 + 3 = 3.

A (4) B (3) C (2) D (0) E (5) F (3) G (4) 1 2 3 4 5 6 EF 0 LF EF 4 LF EF 3 LF EF 6 LF

Event 4 waits for both incoming activities, CC and the dummy DD. EF4=max⁡(EF2+2, EF3+0)=max⁡(6, 3)=6EF_4 = \max(EF_2 + 2,\ EF_3 + 0) = \max(6,\ 3) = 6.

A (4) B (3) C (2) D (0) E (5) F (3) G (4) 1 2 3 4 5 6 EF 0 LF EF 4 LF EF 3 LF EF 6 LF EF 8 LF

Event 5 has the single incoming activity EE, so EF5=EF3+5=3+5=8EF_5 = EF_3 + 5 = 3 + 5 = 8.

A (4) B (3) C (2) D (0) E (5) F (3) G (4) 1 2 3 4 5 6 EF 0 LF EF 4 LF EF 3 LF EF 6 LF EF 8 LF EF 12 LF

EF6=max⁡(EF4+3, EF5+4)=max⁡(9, 12)=12EF_6 = \max(EF_4 + 3,\ EF_5 + 4) = \max(9,\ 12) = 12. The project duration is 1212.

A (4) B (3) C (2) D (0) E (5) F (3) G (4) 1 2 3 4 5 6 EF 0 LF EF 4 LF EF 3 LF EF 6 LF EF 8 LF EF 12 LF 12

Event 6 has no successors, so LF6LF_6 is the project duration, LF6=12LF_6 = 12.

A (4) B (3) C (2) D (0) E (5) F (3) G (4) 1 2 3 4 5 6 EF 0 LF EF 4 LF EF 3 LF EF 6 LF EF 8 LF 8 EF 12 LF 12

LF5=LF6−tG=12−4=8LF_5 = LF_6 - t_G = 12 - 4 = 8.

A (4) B (3) C (2) D (0) E (5) F (3) G (4) 1 2 3 4 5 6 EF 0 LF EF 4 LF EF 3 LF EF 6 LF 9 EF 8 LF 8 EF 12 LF 12

LF4=LF6−tF=12−3=9LF_4 = LF_6 - t_F = 12 - 3 = 9.

A (4) B (3) C (2) D (0) E (5) F (3) G (4) 1 2 3 4 5 6 EF 0 LF EF 4 LF EF 3 LF 3 EF 6 LF 9 EF 8 LF 8 EF 12 LF 12

Event 3 has 2 outgoing activities, the dummy DD and EE, so the smaller value wins. LF3=min⁡(LF4−0, LF5−5)=min⁡(9, 3)=3LF_3 = \min(LF_4 - 0,\ LF_5 - 5) = \min(9,\ 3) = 3.

A (4) B (3) C (2) D (0) E (5) F (3) G (4) 1 2 3 4 5 6 EF 0 LF EF 4 LF 7 EF 3 LF 3 EF 6 LF 9 EF 8 LF 8 EF 12 LF 12

LF2=LF4−tC=9−2=7LF_2 = LF_4 - t_C = 9 - 2 = 7.

A (4) B (3) C (2) D (0) E (5) F (3) G (4) 1 2 3 4 5 6 EF 0 LF 0 EF 4 LF 7 EF 3 LF 3 EF 6 LF 9 EF 8 LF 8 EF 12 LF 12

Event 1 has 2 outgoing activities, AA and BB. LF1=min⁡(LF2−4, LF3−3)=min⁡(3, 0)=0LF_1 = \min(LF_2 - 4,\ LF_3 - 3) = \min(3,\ 0) = 0.

Every float can be read from the graph. For an activity from event ii to event jj with duration tt, use the boxes at its two events:

  • The EF box at ii is the earliest the activity can start.
  • The LF box at jj is the latest the activity can finish.
  • The EF box at jj is the earliest any successor of the activity can start.
  • The LF box at ii is the latest any predecessor of the activity can finish.

This gives the three floats directly:

Total float=LFj−EFi−t\text{Total float} = LF_j - EF_i - tFree float=EFj−EFi−t\text{Free float} = EF_j - EF_i - tIndependent float=max⁡(EFj−LFi−t, 0)\text{Independent float} = \max\big(EF_j - LF_i - t,\ 0\big)

For AA, which runs from event 1 to event 2 with t=4t = 4, the boxes show EF1=0EF_1 = 0, LF1=0LF_1 = 0, EF2=4EF_2 = 4 and LF2=7LF_2 = 7.

  • Total float is 7−0−4=37 - 0 - 4 = 3
  • Free float is 4−0−4=04 - 0 - 4 = 0
  • Independent float is max⁡(4−0−4, 0)=0\max(4 - 0 - 4,\ 0) = 0

For CC, which runs from event 2 to event 4 with t=2t = 2, the boxes show EF2=4EF_2 = 4, LF2=7LF_2 = 7, EF4=6EF_4 = 6 and LF4=9LF_4 = 9.

  • Total float is 9−4−2=39 - 4 - 2 = 3
  • Free float is 6−4−2=06 - 4 - 2 = 0
  • Independent float is max⁡(6−7−2, 0)=0\max(6 - 7 - 2,\ 0) = 0

For FF, which runs from event 4 to event 6 with t=3t = 3, the boxes show EF4=6EF_4 = 6, LF4=9LF_4 = 9, EF6=12EF_6 = 12 and LF6=12LF_6 = 12.

  • Total float is 12−6−3=312 - 6 - 3 = 3
  • Free float is 12−6−3=312 - 6 - 3 = 3
  • Independent float is max⁡(12−9−3, 0)=0\max(12 - 9 - 3,\ 0) = 0

The other activities are read the same way.

Wolfram Mathematica notebooks

A companion notebook for this note. Open it in Mathematica and evaluate the cells to reproduce the worked example.

The summary notebook defines every function used in this module, with documentation and no examples, as a starting point for your own problems.

Written by October 25, 2026 8 min read
Was this helpful?