Project Management & Agile Module 4 – Scheduling: networks, critical path and Gantt charts
The critical path method, step by step
Compute early and late dates with the forward and backward passes, find each activity's float and the critical path, and check that the path is valid.
What you will learn
- Compute early and late start and finish dates with the forward and backward passes
- Calculate total float and free float and identify the critical path
- Explain why the critical path can move and why near-critical paths matter
- Check a critical path against GAO's validity criteria and interpret negative float
Before you start
What you’ll learn · Before you start
What you will learn
- Compute early and late start and finish dates with the forward and backward passes
- Calculate total float and free float and identify the critical path
- Explain why the critical path can move and why near-critical paths matter
- Check a critical path against GAO's validity criteria and interpret negative float
Before you start
On this page
The tech fest’s 14 activities take 76 working days if they are done one after another, yet the fest can be over in 38, because most of them run side by side. Which activities decide those 38 days, and how long may each of the others slip before the date moves? Two passes over the network answer both questions exactly.
You will run the forward and backward passes by hand and check them against a program, compute total and free float, find the critical path and watch it move when one activity grows, and test the path against GAO’s criteria for a valid one.
The forward pass gives every activity its earliest start and finish
The forward pass: The walk through a schedule network from start to finish that gives each activity its early start and early finish; at a merge it takes the latest predecessor. walks the network from the start to the finish. Each activity starts as soon as its links allow, its early start (ES), and finishes its duration later, its early finish (EF). With a finish-to-start link, the successor’s ES is the predecessor’s EF. With several predecessors, an activity waits for the latest of them, which is the step that most hand calculations get wrong.
Days are counted from the start: ES 3 means the activity starts once 3 working days have passed. A, authorise plan and budget, has ES 0 and EF 3. C and E both wait for A, so both have ES 3. The two other link types follow their own ends: I starts 2 days after H starts (ES 11 + 2 = 13), and M’s finish link with I only asks that M finish after day 23. Step through the pass on nine of the fest’s activities; the second half of the figure is the backward pass of the next section:
The drawing shows the whole scene; its 12 steps are listed below.
Every step as text
- Forward pass, A first. The forward pass starts at the beginning. A has nothing before it except the start, so its early start is 0 and its early finish is 0 + 3 = 3.
- C and E follow A. C and E both wait for A to finish, so both start early at 3. C, 5 days, finishes at 8; E, 8 days, finishes at 11.
- D, then H. D waits for C and runs from 8 to 18. H waits for E and runs from 11 to 15.
- A start link with a lag. I may start 2 days after H starts, so its early start is 11 + 2 = 13, and with 10 days it finishes at 23. F waits for D and runs from 18 to 30.
- L takes the later finish. L waits for F, done at 30, and for K, done at 10. An activity starts after the latest of its predecessors, so L runs from 30 to 32.
- M, where four links meet. L allows M to start at 32, H at 15 and J, not drawn here, at 14, while the finish link with I only needs M to finish after 23. The latest wins, so M runs from 32 to 34, and N brings the finish to 38.
- Backward pass, from the end. The backward pass starts at the finish, 38, and runs back. N must be done by 38, so M's late finish is 34 and its late start 34 − 2 = 32, the same as its early start.
- L, F, D and C have no slack. Each of these must finish when its successor must start, which is also when it finishes early. Their late dates equal their early dates, so their total float is 0.
- I may finish as late as M. The finish link says I must be done by M's late finish, 34, so its late start is 24. Its early start was 13, which gives it 11 days of total float.
- H has two successors. I must start by 24, so H must start by 24 − 2 = 22. M must start by 32, so H must finish by 32, which is later. The earlier limit wins, LS 22, and H also has 11 days of float.
- E shares the same float. E must finish when H must start, 22, so its late start is 14 and its float 11. E, H and I form a chain that can slip 11 days together without moving the finish.
- A must not slip at all. C must start by 3 and E by 14, so A must finish by 3, the earlier of the two. Its late start is 0, the same as its early start, and the chain A, C, D, F, L, M is the critical path.
At M four links meet. L allows a start at day 32, H at 15, J at 14 and the finish link with I at 21, so M starts at 32, the latest, and finishes at 34. The fest’s finish milestone comes after N’s 4 days, at 38. GAO’s schedule guide describes the same calculation as the software’s: the forward pass adds durations to early starts, and the backward pass subtracts them from late finishes.
Taking the earliest predecessor at a merge
Wrong: starting L at day 10, when K is done. Right: L starts at day 30, after F, the later of its two predecessors. At every merge, the successor waits for the latest predecessor it is linked to.
The backward pass and float say how late each activity may run
The backward pass: The walk back from the finish that gives each activity its late finish and late start, the latest dates that keep the finish where it is. starts from the finish, day 38, and walks back. Each activity’s late finish (LF) is the latest it may finish without moving the finish, and its late start (LS) is LF minus its duration. With several successors, an activity takes the earliest limit any of them sets. The difference between the late and the early dates is its total float: How many days an activity can slip before the project's finish moves: its late start minus its early start., the days it can slip before the finish moves. The program below runs both passes over all 16 rows of the network:
"""Forward and backward passes over the tech fest network, with total and free float and the critical path.
Durations are working days. ES and EF are the early start and finish, LS and LF the late ones, all counted in days
from the start: an activity with ES 3 and EF 8 starts after 3 working days and is done after 8. Links: FS
(finish-to-start), SS (start-to-start) and FF (finish-to-finish), with a lag in days. Total float is LS - ES, the
slip an activity can take before the finish moves; free float is the slip it can take before any successor moves
(both as GAO's Schedule Assessment Guide, GAO-16-89G, defines them).
"""
FEST = {
"S": ("Milestone: start", 0, []),
"A": ("Authorise plan and budget", 3, [("S", "FS", 0)]),
"B": ("Book the auditorium", 2, [("A", "FS", 0)]),
"C": ("Prepare sponsor packages", 5, [("A", "FS", 0)]),
"D": ("Sign sponsors", 10, [("C", "FS", 0)]),
"E": ("Design the coding contest", 8, [("A", "FS", 0)]),
"F": ("Build the robotics arena", 12, [("D", "FS", 0)]),
"G": ("Line up speakers", 6, [("B", "FS", 0)]),
"H": ("Build the registration form", 4, [("E", "FS", 0)]),
"I": ("Run the publicity campaign", 10, [("H", "SS", 2)]),
"J": ("Print posters", 3, [("G", "FS", 0)]),
"K": ("Plan crowd control and first aid", 5, [("B", "FS", 0)]),
"L": ("Set up sound, lights and stage", 2, [("F", "FS", 0), ("K", "FS", 0)]),
"M": ("Hold the fest", 2, [("L", "FS", 0), ("H", "FS", 0), ("J", "FS", 0), ("I", "FF", 0)]),
"N": ("Close the accounts and report", 4, [("M", "FS", 0)]),
"Z": ("Milestone: finish", 0, [("N", "FS", 0)]),
}
def passes(net, finish_by=None):
"""Returns ES, EF, LS, LF, total float and free float. finish_by: {activity: latest finish day}, a constraint."""
order = list(net) # the dict is written in an order where every predecessor comes first
dur = {a: net[a][1] for a in net}
es, ef = {}, {}
for a in order:
start = 0
for p, kind, lag in net[a][2]:
if kind == "FS":
start = max(start, ef[p] + lag)
elif kind == "SS":
start = max(start, es[p] + lag)
elif kind == "FF":
start = max(start, ef[p] + lag - dur[a])
es[a], ef[a] = start, start + dur[a]
end = max(ef.values())
succs = {a: [(s, kind, lag) for s in net for p, kind, lag in net[s][2] if p == a] for a in net}
ls, lf = {}, {}
for a in reversed(order):
finish = end
for s, kind, lag in succs[a]:
if kind == "FS":
finish = min(finish, ls[s] - lag)
elif kind == "SS":
finish = min(finish, ls[s] - lag + dur[a])
elif kind == "FF":
finish = min(finish, lf[s] - lag)
if finish_by and a in finish_by:
finish = min(finish, finish_by[a])
lf[a], ls[a] = finish, finish - dur[a]
total = {a: ls[a] - es[a] for a in net}
free = {}
for a in net:
slack = [end - ef[a]] if not succs[a] else []
for s, kind, lag in succs[a]:
if kind == "FS":
slack.append(es[s] - lag - ef[a])
elif kind == "SS":
slack.append(es[s] - lag - es[a])
elif kind == "FF":
slack.append(ef[s] - lag - ef[a])
free[a] = min(slack)
return es, ef, ls, lf, total, free, end
def critical(net, total):
low = min(total.values())
return [a for a in net if total[a] == low]
def valid(net, path):
"""GAO best practice 6, the checks a program can make: one continuous chain of logic from start to finish,
no lags or leads on it, no milestone carrying a duration."""
problems = []
on = set(path)
for a in path[1:]:
if not any(p in on for p, _, _ in net[a][2]):
problems.append(f"{a} has no critical predecessor: the path is broken")
for p, _, lag in net[a][2]:
if p in on and lag:
problems.append(f"the link {p} -> {a} carries a lag of {lag}")
return problems or ["valid: continuous from start to finish, no lags or leads, driven by logic alone"]
es, ef, ls, lf, total, free, end = passes(FEST)
print(f"{'Id':<3}{'Activity':<34}{'Days':>4}{'ES':>4}{'EF':>4}{'LS':>4}{'LF':>4}{'Total':>7}{'Free':>6}")
for a, (name, days, _) in FEST.items():
print(f"{a:<3}{name:<34}{days:>4}{es[a]:>4}{ef[a]:>4}{ls[a]:>4}{lf[a]:>4}{total[a]:>7}{free[a]:>6}")
path = critical(FEST, total)
print(f"Critical path: {' '.join(path)}, {end} working days")
print("Check:", "; ".join(valid(FEST, path)))
near = sorted((t, a) for a, t in total.items() if 0 < t <= 15)
print("Near-critical (total float 1 to 15 days):", ", ".join(f"{a} {t}" for t, a in near))
for days in (19, 20):
slow = dict(FEST)
slow["E"] = ("Design the coding contest", days, FEST["E"][2])
*_, total2, _, end2 = passes(slow)
print(f"If E takes {days} days instead of 8: finish after {end2} days, critical path {' '.join(critical(slow, total2))}")
es3, ef3, ls3, lf3, total3, free3, end3 = passes(FEST, finish_by={"M": 32})
late = [f"{a} {total3[a]}" for a in FEST if total3[a] < 0]
print(f"If the fest must be over by day 32: total float {', '.join(late)}") Output
Id Activity Days ES EF LS LF Total Free S Milestone: start 0 0 0 0 0 0 0 A Authorise plan and budget 3 0 3 0 3 0 0 B Book the auditorium 2 3 5 21 23 18 0 C Prepare sponsor packages 5 3 8 3 8 0 0 D Sign sponsors 10 8 18 8 18 0 0 E Design the coding contest 8 3 11 14 22 11 0 F Build the robotics arena 12 18 30 18 30 0 0 G Line up speakers 6 5 11 23 29 18 0 H Build the registration form 4 11 15 22 26 11 0 I Run the publicity campaign 10 13 23 24 34 11 11 J Print posters 3 11 14 29 32 18 18 K Plan crowd control and first aid 5 5 10 25 30 20 20 L Set up sound, lights and stage 2 30 32 30 32 0 0 M Hold the fest 2 32 34 32 34 0 0 N Close the accounts and report 4 34 38 34 38 0 0 Z Milestone: finish 0 38 38 38 38 0 0 Critical path: S A C D F L M N Z, 38 working days Check: valid: continuous from start to finish, no lags or leads, driven by logic alone Near-critical (total float 1 to 15 days): E 11, H 11, I 11 If E takes 19 days instead of 8: finish after 38 days, critical path S A C D E F H I L M N Z If E takes 20 days instead of 8: finish after 39 days, critical path S A E H I M N Z If the fest must be over by day 32: total float S -2, A -2, C -2, D -2, F -2, L -2, M -2
Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 cpm.py
Read the table one row at a time. K, crowd control and first aid, has ES 5 and LS 25: it may start up to 20 days late. B, the auditorium booking, has 18 days of total float but 0 days of free float: How many days an activity can slip before the early start of any of its successors moves; never more than its total float., the slip it can take before any successor moves. Any delay to B delays G and K at once, although the finish has room. That difference matters to the people who own G and K, and it is why GAO’s guide defines both.
| Activity | Total float | Free float | What a 5-day slip does |
|---|---|---|---|
| K · crowd plan | 20 | 20 | nothing at all |
| J · posters | 18 | 18 | nothing at all |
| B · auditorium | 18 | 0 | G and K start 5 days later; the finish holds |
| E · coding contest | 11 | 0 | H and I start later; the finish holds |
| D · sign sponsors | 0 | 0 | the fest finishes 5 days later |
Checkpoint
Check: The forward pass · Total and free float
The critical path is the chain with no float, and it moves
The activities with the lowest total float, here 0, form the critical path: The continuous chain of activities with the lowest total float, which sets the earliest date the project can finish.: S, A, C, D, F, L, M, N and Z, 38 working days. GAO’s guide defines it as the longest continuous sequence of activities, the one that sets the earliest finish, so every day lost on it is a day lost at the end unless something is done about it. The guide adds that “critical” has this exact meaning: an important activity is not necessarily critical, and a dull one, such as setting up the stage, can be.
The path is not fixed. E, H and I share 11 days of total float, so they are a near-critical path: A chain of activities with a little total float, which becomes the critical path if it slips by more than that float.. The program’s last lines show what a slip on it does:
| E, design the coding contest | Fest finishes after | Critical path |
|---|---|---|
| 8 days, as planned | 38 days | S, A, C, D, F, L, M, N, Z |
| 19 days, 11 more | 38 days | both chains, tied |
| 20 days, 12 more | 39 days | S, A, E, H, I, M, N, Z |
A slip of exactly the chain’s float leaves the finish alone but makes two critical paths. One day more and the events chain sets the finish, while the sponsor chain, which everyone was watching, now has 1 day of float.
Key idea
The critical path is wherever the float is lowest today, so track the near-critical chains too: one slip larger than their float makes them the path that sets the finish.
A valid critical path is driven by logic alone
A path can be the longest and still be wrong. GAO’s checklist for its sixth best practice asks that the critical path run continuously from the status date to the finish milestone, carry no lags or leads, include no level-of-effort or summary activities, and not be made critical by constraints on unimportant activities. The program’s check finds the fest’s path continuous, with no lag on any of its links.
Constraints are the usual trouble. Suppose the college insists that the fest be over by day 32. The last line of the output shows the effect of that constraint: S, A, C, D, F, L and M now have a total float of −2. negative float: Total float below zero, which appears when a required date is earlier than the network allows; its size is the number of days to recover. means the plan already misses the constraint by that many days. It is a warning, not an error: either the work changes, by a shorter path or more people on it, or the date does. With such constraints in a schedule, GAO’s guide asks for the longest path to be shown beside the lowest-float one, because the two can differ.
Exam answers: show the table, then the path
University, NPTEL and certification questions on CPM reward the same layout: a table of ES, EF, LS, LF and float for every activity, then the critical path and its length in one sentence. NPTEL’s Project Management for Managers course from IIT Roorkee gives a week each to PERT and CPM, to probability in networks and to crashing.
Checkpoint
Check: The critical path and near-critical paths · A valid path and negative float
Practise: passes, float and the path
The questions bring new networks to work through as well as the fest. Do the passes on paper first, then choose or type your answer:
Practice that adapts to you
Practise this lesson
12 questions about 4 ideas of this lesson. Each answer is explained at once, and what you get right is kept in this browser.
Interview questions
Warm-up (fresher to 2–5 years): total float and free float are both slack, so how do they differ?
Total float is how long an activity can slip before the project’s finish moves; free float is how long it can slip before any successor’s early start moves. Free float is never larger than total float. In the tech fest, booking the auditorium has 18 days of total float but 0 of free float: any delay reaches the next two activities at once, although the finish has room. Total float tells the project manager which delays threaten the end date; free float tells the owners of the next activities whether a delay reaches them.
Two harder questions follow, about a manager who wants every activity marked critical and about a schedule full of negative float. Decide what you would check first, then open each first step:
Model answers open with any pass: ₹79 for 1 week ($2.99), one payment that never renews.
-
Mid to senior
A programme director asks you to mark every activity of a 120-activity schedule as critical, "so that nobody relaxes". How do you respond, and what do you offer instead?
-
Mid to senior
After a contract milestone is entered as a "finish no later than" date, 40 activities in your schedule show negative float, from −3 to −15 days. Your sponsor asks whether the project is 15 days late. What do you tell them?
Flashcards · 4 cards
Recall it, then check
Say the answer to yourself before you look: recalling it is what makes it stick.
-
What does the forward pass compute, and what rule applies at a merge?
Each activity's early start (ES) and early finish (EF = ES + duration), walking from the start to the finish. At a merge of several predecessors, the successor's ES is the LATEST predecessor's EF, the step most hand calculations get wrong.
-
What does the backward pass give, and how are total and free float defined?
Each activity's late finish (LF) and late start (LS = LF - duration), walking back from the finish. Total float = LS − ES: slip before the finish moves. Free float: slip before any successor's early start moves. Free float is never larger than total float.
-
What is the critical path, and does it stay fixed?
The longest continuous chain of activities and the one that sets the earliest finish; its activities have the lowest total float (often zero). GAO: "critical" means on this path. It is not fixed: a near-critical chain slipping by more than its float becomes the critical path.
-
What makes a critical path valid (GAO 6th best practice)?
It runs continuously from the status date to the finish milestone, carries no lags or leads, includes no level-of-effort or summary activities, and is not made critical by constraints on unimportant work. Negative float means the plan already misses a constraint date.
Key takeaways
- The forward pass gives each activity its early start and finish, taking the latest predecessor at every merge, and sets the earliest finish of the project.
- The backward pass gives the late dates from the finish back; total float is late start minus early start, and free float is the slip before any successor moves.
- The critical path is the continuous chain with the lowest float, and it moves when a near-critical chain slips by more than its float.
- A valid critical path is driven by logic, with no lags, leads or level-of-effort work on it, and negative float means a constraint date is already missed.
Terms in this lesson
- backward pass
- The walk back from the finish that gives each activity its late finish and late start, the latest dates that keep the finish where it is.
- critical path
- The continuous chain of activities with the lowest total float, which sets the earliest date the project can finish.
- forward pass
- The walk through a schedule network from start to finish that gives each activity its early start and early finish; at a merge it takes the latest predecessor.
- free float
- How many days an activity can slip before the early start of any of its successors moves; never more than its total float.
- near-critical path
- A chain of activities with a little total float, which becomes the critical path if it slips by more than that float.
- negative float
- Total float below zero, which appears when a required date is earlier than the network allows; its size is the number of days to recover.
- total float
- How many days an activity can slip before the project's finish moves: its late start minus its early start.
References
- Schedule Assessment Guide: Best Practices for Project Schedules (GAO-16-89G) (U.S. Government Accountability Office)
- Critical-path planning and scheduling (Kelley and Walker, Eastern Joint Computer Conference, 1959) (Association for Computing Machinery)
- NPTEL: Project Management for Managers (IIT Roorkee), course plan (NPTEL (IITs and IISc, Ministry of Education))
Related tools
Report a problem with this lesson
Kept only in this browser. Your Learn progress