ЁЯПл The SchoolтА║ЁЯзо DSAтА║ЁЯЧ║я╕П рдзрдбрд╛ 10 тАФ Graphs: рдХреЙрд░рд┐рдбреЙрд░рдЪрд╛ рдирдХрд╛рд╢рд╛
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯЧ║я╕П рдзрдбрд╛ 10 тАФ Graphs: рдХреЙрд░рд┐рдбреЙрд░рдЪрд╛ рдирдХрд╛рд╢рд╛

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 10 ┬╖ рдкреБрдвреЗ: lesson-11-dp-greedy


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ10. рдЦреЛрд▓реНрдпрд╛ рдЖрдгрд┐ рдХреЙрд░рд┐рдбреЙрд░, рджреЛрди рдореВрд▓рднреВрдд рдЪрд╛рд▓реА, рдЕрдВрддрд░ рдореЛрдЬрдгрд╛рд░реА рдЪрд╛рд▓, рдЖрдгрд┐ cycle рдУрд│рдЦрдгреЗ.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рд╢рд╛рд│рд╛ рдореНрд╣рдгрдЬреЗ рдХреЙрд░рд┐рдбреЙрд░рдиреА рдЬреЛрдбрд▓реЗрд▓реНрдпрд╛ рдЦреЛрд▓реНрдпрд╛ тАФ рд╣рд╛рдЪ graph. рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдкрд╛рд╕реВрди рд╢реЛрдз рдШреЗрдгреНрдпрд╛рдЪреНрдпрд╛ рддреАрди рдкрджреНрдзрддреА: BFS рдкрд╕рд░рдд рдЬрд╛рддреЛ тАФ рдПрдХрд╛ рдХреЙрд░рд┐рдбреЙрд░ рдЕрдВрддрд░рд╛рд╡рд░рдЪреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛ рдЦреЛрд▓реНрдпрд╛, рдордЧ рджреЛрди, рдордЧ рддреАрди (рднреЗрдЯ рджреНрдпрд╛рдпрдЪреНрдпрд╛ рдЦреЛрд▓реНрдпрд╛рдВрдЪреА рдЬреЗрд╡рдгрд╛рд╕рд╛рд░рдЦреА рд░рд╛рдВрдЧ) тАФ рдореНрд╣рдгреВрди рдПрдЦрд╛рджреНрдпрд╛ рдЦреЛрд▓реАрдд рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛ рдкреЛрд╣реЛрдЪрддрд╛ рддреЗрд╡реНрд╣рд╛ рддреЗ рд╕рд░реНрд╡рд╛рдд рдХрдореА рдХреЙрд░рд┐рдбреЙрд░рдордзреВрди рдЕрд╕рддреЗ. DFS рдПрдХ рдХреЙрд░рд┐рдбреЙрд░ рдЕрдЧрджреА рд╢реЗрд╡рдЯрдкрд░реНрдпрдВрдд рдзрд░рддреЛ, рдордЧ рдорд╛рдЧреЗ рдпреЗрдКрди рдкреБрдврдЪрд╛ рдХрд░реВрди рдкрд╛рд╣рддреЛ (рдкрд░реНрдпрд╛рдпрд╛рдВрдЪреА рдЪрд│рдд). Dijkstra рдореЛрдЬрддреЛ тАФ рдХреЙрд░рд┐рдбреЙрд░рдирд╛ рд▓рд╛рдВрдмреА рдЕрд╕рддреЗ, рдореНрд╣рдгреВрди рдЖрддрд╛рдкрд░реНрдпрдВрдд рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗрд▓реА рд╕рд░реНрд╡рд╛рдд рд▓рд╣рд╛рди рдЪрд╛рд▓ рдиреЗрд╣рдореА рдкреБрдвреЗ рд╡рд╛рдврд╡рд╛ (рдЪрд╛рд▓реАрдВрдЪреЗ рд╡реНрдпрд╛рд╕рдкреАрда). рдЖрдзреА рдкрд╛рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдЦреЛрд▓реАрдХрдбреЗ рдкрд░рдд рдиреЗрдгрд╛рд░рд╛ рдХреЙрд░рд┐рдбреЙрд░ рдореНрд╣рдгрдЬреЗ cycle.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
  O["office"] ---|20| H["hall"]
  H ---|30| L["lab"] ; H ---|10| B["library"]
  B ---|60| G["gym"] ; L ---|15| G
  G ---|40| F["field"]

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

рдирдХрд╛рд╢реЗ, dependencies, social networks, state machines, Networking school рдЪреЗ routes рдЖрдгрд┐ Kubernetes school рдЪреЗ pods тАФ рд╕рдЧрд│реЗ graphs рдЖрд╣реЗрдд. BFS рдЖрдгрд┐ DFS рд╣реА рддреБрдореНрд╣реА рд╕рд░реНрд╡рд╛рдд рдЖрдзреА рд╣рд╛рддреА рдШреЗрдгрд╛рд░реА рджреЛрди рд╕рд╛рдзрдиреЗ; рдЕрдВрддрд░ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ Dijkstra.

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

bfs deque рд╡рд╛рдкрд░рддреЛ; dfs seen set рд╕рд╣ recursive рдЖрд╣реЗ; dijkstra heapq рд╡рд╛рдкрд░рддреЛ рдЖрдгрд┐ рд╢рд┐рд│реНрдпрд╛ (stale) entries рд╕реЛрдбреВрди рджреЗрддреЛ; has_cycle parent рдЦрд╛рд▓реА рдкрд╛рдард╡рддреЛ. demo.py graphs рд╕рд╣рд╛ рдЦреЛрд▓реНрдпрд╛рдВрдЪрд╛ рдирдХрд╛рд╢рд╛ рдмрдирд╡рддреЛ рдЖрдгрд┐ hops, рдХреНрд░рдо рдЖрдгрд┐ рдореАрдЯрд░ рд╡рд┐рдЪрд╛рд░рддреЛ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

python3 dsa/demo.py graphs
python3 - <<'EOF'
import sys; sys.path.insert(0, "dsa"); from structures import Graph; from algorithms import bfs, dijkstra, has_cycle
g = Graph(directed=True)
for a, b in (("wake", "wash"), ("wash", "dress"), ("wake", "eat"), ("dress", "leave"), ("eat", "leave")): g.add_edge(a, b)
print("hops from wake:", bfs(g, "wake"))
# topological order: DFS post-order, reversed
seen, order = set(), []
def go(r):
    seen.add(r); [go(n) for n in g.neighbours(r) if n not in seen]; order.append(r)
go("wake"); print("do things in this order:", order[::-1])
EOF

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

BFS hops {office: 0, hall: 1, lab: 2, library: 2, gym: 3, field: 4}, office рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрдгрд╛рд░рд╛ DFS рдХреНрд░рдо, Dijkstra рдореАрдЯрд░ {тАж, gym: 65, field: 105} (library рдорд╛рд░реНрдЧреЗ рдирд╛рд╣реА, lab рдорд╛рд░реНрдЧреЗ), рдЖрдгрд┐ cycle? True. рддреБрдордЪрд╛ рд╕рдХрд╛рд│рдЪрд╛ graph wake рдкрд╣рд┐рд▓рд╛ рдЖрдгрд┐ leave рд╢реЗрд╡рдЯреА рдЕрд╕рд▓реЗрд▓рд╛ рдпреЛрдЧреНрдп рдХреНрд░рдо print рдХрд░рддреЛ.

ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ

рддреБрдореНрд╣реА graph рдорд╛рдВрдбрд▓рд╛, рддреНрдпрд╛рддреВрди рддреАрди рдкреНрд░рдХрд╛рд░реЗ рдЪрд╛рд▓рд▓рд╛рдд, рд╕рд░реНрд╡реЛрддреНрддрдо рдорд╛рд░реНрдЧрд╛рд╡рд░ hops рдЖрдгрд┐ рдореАрдЯрд░ рдПрдХрдордд рд╣реЛрдд рдирд╛рд╣реАрдд рд╣реЗ рдкрд╛рд╣рд┐рд▓реЗ, рдЖрдгрд┐ DFS рд╡рд░реВрди tasks рдЪрд╛ рдХреНрд░рдо рдХрд╛рдврд▓рд╛.

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: package managers, build systems, CI pipelines (DAGs), routing tables, recommendation graphs, рдЖрдгрд┐ "рдпрд╛ outage рдЪрд╛ рдХреЛрдгрддреНрдпрд╛ services рд╡рд░ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЛ?" тАФ рд╕рдЧрд│реНрдпрд╛ graph рдЪрд╛рд▓реА.

тПня╕П рдкреБрдвреЗ

рдзрдбрд╛ 11 тАФ dynamic programming рдЖрдгрд┐ greedy: рдлрд│реНрдпрд╛рд╡рд░рдЪреА рдЙрддреНрддрд░реЗ, рдЖрдгрд┐ рд╕рд░рд│ рджрд┐рд╕рдгрд╛рд░реА рдкрд╛рдпрд░реА рдХрдзреА рдкреБрд░реЗрд╢реА рдЕрд╕рддреЗ.

ЁЯЧ║я╕П Lesson 10 тАФ Graphs: the corridor map

ЁЯУН You are here: Lesson 10 of 12 ┬╖ Next: lesson-11-dp-greedy


ЁЯУж What's in this branch

Lessons 01тАУ10. Rooms and corridors, the two fundamental walks, the one that measures, and cycle detection.

ЁЯзТ Explain like I'm 5

The school is rooms joined by corridors тАФ that is a graph. Three ways to explore from the office: BFS floods тАФ every room one corridor away, then two, then three (a lunch line of rooms to visit) тАФ so the first time you reach a room is the fewest corridors. DFS follows one corridor to its very end before backing up and trying the next (a pile of choices). Dijkstra measures тАФ corridors have lengths, so always extend the shortest walk you know so far (a podium of walks). A corridor leading back to a room you have seen is a cycle.

ЁЯЧ║я╕П Diagram

flowchart LR
  O["office"] ---|20| H["hall"]
  H ---|30| L["lab"] ; H ---|10| B["library"]
  B ---|60| G["gym"] ; L ---|15| G
  G ---|40| F["field"]

тЭУ What

ЁЯдФ Why

Maps, dependencies, social networks, state machines, the Networking school's routes and the Kubernetes school's pods are all graphs. BFS and DFS are the two tools you reach for first; Dijkstra when distance matters.

ЁЯФз How (in this repo)

bfs uses deque; dfs is recursive with a seen set; dijkstra uses heapq and skips stale entries; has_cycle passes the parent down. demo.py graphs builds the six-room map and asks hops, order and metres.

ЁЯзк Try it

python3 dsa/demo.py graphs
python3 - <<'EOF'
import sys; sys.path.insert(0, "dsa"); from structures import Graph; from algorithms import bfs, dijkstra, has_cycle
g = Graph(directed=True)
for a, b in (("wake", "wash"), ("wash", "dress"), ("wake", "eat"), ("dress", "leave"), ("eat", "leave")): g.add_edge(a, b)
print("hops from wake:", bfs(g, "wake"))
# topological order: DFS post-order, reversed
seen, order = set(), []
def go(r):
    seen.add(r); [go(n) for n in g.neighbours(r) if n not in seen]; order.append(r)
go("wake"); print("do things in this order:", order[::-1])
EOF

тЬЕ Verify тАФ what you should see

BFS hops {office: 0, hall: 1, lab: 2, library: 2, gym: 3, field: 4}, a DFS order starting at the office, Dijkstra metres {тАж, gym: 65, field: 105} (via the lab, not the library), and cycle? True. Your morning graph prints a valid order with wake first and leave last.

ЁЯПБ What you just proved

You represented a graph, walked it three ways, saw hops and metres disagree on the best route, and derived a task order from a DFS.

тЪая╕П Common mistakes

ЁЯПн Why this matters in production: package managers, build systems, CI pipelines (DAGs), routing tables, recommendation graphs, and "which services does this outage affect?" тАФ all graph walks.

тПня╕П Next

Lesson 11 тАФ dynamic programming & greedy: answers on the board, and when taking the obvious step is enough.

тЖР Previoustrees heapsNext тЖТdp greedy

This page is the lesson's README from the lesson-10-graphs branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.