TDT4120 Algoritmer og datastrukturer Interaktiv pensumguide · H2026
Fremgang
0/14
12
Grafer

Maksimal flyt

Kjernepensum ~45 min lesing · Flyt · Reduksjon · Dualitet

Flyt er det mest allsidige grafproblemet i pensum: det kobler optimering, dualitet og reduksjoner i ett rammeverk. Mange tilsynelatende urelaterte problemer — maksimal paring, kantdisjunkte stier, prosjektutvelgelse — løses ved å oversette dem til et flytnett og kjøre én algoritme.

Flytnett, flyt og maks-flyt

Et flytnett er en rettet graf G=(V,E)G = (V, E) med en ikke-negativ kapasitet c(u,v)0c(u,v) \ge 0 på hver kant, en kilde ss og en sluk tt. En flyt er en funksjon f(u,v)f(u,v) som oppfyller to krav:

Maks-flyt-problemet er å finne en lovlig flyt med størst mulig verdi f|f|. Verdien er begrenset oppad av enhver «flaskehals» i nettet — det er nettopp denne dualiteten min-snitt-teoremet gjør presis.

Restnett og forøkende stier

Gitt en flyt ff er ikke det interessante hvor mye som er sendt, men hvor mye mer som kan sendes. Det fanger restnettet GfG_f.

Bakoverkantene er nøkkelen: de lar algoritmen ombestemme seg og dirigere flyt en bedre vei senere. En forøkende sti er en hvilken som helst sti fra ss til tt i GfG_f. Langs den kan vi øke flytverdien med stiens flaskehals — den minste restkapasiteten på stien — uten å bryte verken kapasitet eller bevaring.

Maks-flyt/min-snitt-teoremet

Et snitt (S,T)(S, T) deler nodene slik at sSs \in S og tTt \in T. Snittets kapasitet er summen av kapasiteten på alle kanter som krysser fra SS til TT. Enhver flyt må passere et hvilket som helst snitt, så f|f| er aldri større enn kapasiteten til noe snitt. Det stramme tilfellet er hovedresultatet:

Ekvivalensen (1) ⁣ ⁣(2)(1)\!\Leftrightarrow\!(2) gir terminerings­garantien for algoritmene under; (2) ⁣ ⁣(3)(2)\!\Leftrightarrow\!(3) gir et sertifikat: når søket ikke finner flere stier, danner nodene som fortsatt er nåbare fra ss i GfG_f den ene siden SS av et minimalt snitt.

Ford-Fulkerson-metoden

Ford-Fulkerson er en metode, ikke én bestemt algoritme: så lenge restnettet har en forøkende sti, finn en og forøk flyten langs den.

ford_fulkerson.py
def ford_fulkerson(G, s, t):
  for (u, v) in G.E:
      f[u][v] = 0
  while finnes_forøkende_sti(G_f, s, t):
      p = bfs_sti(G_f, s, t)
      c_f = min(restkapasitet(u, v) for (u, v) in p)
      for (u, v) in p:
          f[u][v] += c_f          # eller opphev motgående flyt
  return sum(f[s][v] for v in G.adj[s])
Ford-Fulkerson / Edmonds-Karp

Interaktiv visualisering krever JavaScript.

0 / 0

Kanter er merket med flyt/kapasitet. Den oransje stien er forøkende; røde kanter er mettede ($f = c$). Hver runde finner en sti i restnettet og sender flaskehalsen langs den. Spill av eller stega med piltastene; nettet er det klassiske CLRS-eksemplet med maks-flyt $23$.

Hvis vi alltid velger den korteste forøkende stien (færrest kanter), målt med et BFS i restnettet, får vi Edmonds-Karp. Det er nettopp denne varianten stepperen viser. Edmonds-Karp kjører i O(VE2)O(VE^2) uavhengig av kapasitetene, mens en uheldig stivalg-strategi i den rene metoden kan bruke flere forøkninger jo større tallene er.

Heltallsteoremet

Når algoritmen følger en sti og legger til flaskehalsen, holder den seg innenfor heltallene så lenge kapasitetene er heltall:

Dette er grunnen til at flyt kan modellere kombinatoriske «alt-eller-ingenting»-valg: en heltallsflyt med kapasiteter 0/10/1 velger faktisk hele kanter eller paringer.

Reduksjoner til maks-flyt

Styrken ligger i at andre problemer kan reduseres til maks-flyt. Mønsteret er alltid det samme: bygg et flytnett der en heltalls maks-flyt koder en optimal løsning på det opprinnelige problemet.

ProblemKonstruksjonMaks-flyt betyr
Maksimal paring (todelt graf)ss \to venstre side, kanter med kap. 11, høyre side t\to tantall par i en største paring
Kantdisjunkte stieralle kanter får kapasitet 11antall stier fra ss til tt uten felles kant
Flere kilder/sluksuperkilde og supersluk med uendelig kapasitetsamlet flyt fra alle kilder
Tre standardreduksjoner til maks-flyt. Heltallsteoremet sikrer at 0/10/1-kapasiteter gir en kombinatorisk (hele kanter) løsning.

Sjekk deg selv

Hva beskriver restnettet GfG_f?