Tilbake
5.1

5.1 Flytnett, restnett og snitt

Flytnett, restkapasitet og restnett, snitt `(S,T)`, og heltallsteoremet — begrepene alle flytoppgaver hviler på.

55 min
8 oppgaver
Flytnettrestnettsnitt
Din fremgang i kapitlet
0 / 8 oppgaver

Forkunnskaper

- kap. 4.1 — grafrepresentasjon og traversering. Et
flytnett er en rettet graf, og den eneste algoritmen vi trenger i dette
kapitlet, er BFS: den brukes til å lete etter en vei fra ss til tt.
- Mengdelære — hvis notasjonen G=(V,E)G=(V,E), «vVv \in V» og «en
partisjon av VV» er uvant. Et snitt er nettopp en partisjon av nodemengden i
to deler.

Du trenger ingen ny algoritme i dette kapitlet. Alt handler om å lese og regne på
et nett med tall på kantene — algoritmene kommer i
kap. 5.2.

Notasjons- og pseudokodeliste

Vann gjennom et nett med kapasiteter (~12 min)

Et vanningsanlegg på en gård henter vann fra ett pumpehus og fører det gjennom
nedgravde rør til ett jorde. Underveis går vannet innom kummer der rørene
forgrener seg. Hvert rør har en øvre grense for hvor mange liter i minuttet det
tåler, og i kummene renner det verken bort eller oppstår vann av seg selv: alt som
kommer inn, går ut igjen.

Spørsmålet bonden stiller, er det samme spørsmålet et strømnett, en containerhavn
og en vaktliste stiller: hvor mye kan vi maksimalt få fram fra start til mål?
Og når svaret er «ikke mer enn dette» — hvor sitter da proppen?

Hele Del 5 er svaret på de to spørsmålene. Dette kapitlet bygger begrepene, og
kap. 5.2 gir algoritmene som regner dem ut.

Flytnett

En rettet graf der hver kant har en øvre grense for hvor mye som kan passere, og
der én node er utpekt som start og én som mål.

Formelt er et flytnett en rettet graf G=(V,E)G=(V,E) med en kilde ss, et sluk
tt og en kapasitetsfunksjon cc som gir hver kant (u,v)E(u,v) \in E et tall
c(u,v)0c(u,v) \ge 0. Finnes det ingen kant fra uu til vv, setter vi c(u,v)=0c(u,v)=0. Vi
antar at hver node ligger på en vei fra ss til tt; noder som ikke gjør det, kan
aldri bære flyt og kan strykes.

Kilde og sluk

Kilden ss er noden all flyt starter i, og sluket tt er noden all flyt ender i.
De to er de eneste nodene som får ha ubalanse mellom inn og ut.

Alle andre noder er gjennomgangsnoder. Det er nettopp derfor flytverdien kan måles
to steder med samme svar: det som netto forlater ss, er det samme som det som
netto ankommer tt.

Flyt

En tildeling av et tall til hver kant, som sier hvor mye som faktisk sendes der, og
som oppfyller to betingelser samtidig.

En flyt er en funksjon som gir hvert nodepar en verdi f(u,v)f(u,v) og oppfyller
kapasitetsbetingelsen 0f(u,v)c(u,v)0 \le f(u,v) \le c(u,v) for alle kanter, og
bevaringsbetingelsen i alle noder unntatt ss og tt. Flytverdien er
f=vVf(s,v)vVf(v,s)\lvert f\rvert = \sum_{v \in V} f(s,v) - \sum_{v \in V} f(v,s), altså netto ut
av kilden. Maks-flyt-problemet er å finne en flyt med størst mulig verdi.

Kapasitetsbetingelsen

Ingen kant får bære mer enn kapasiteten sin, og ingen kant får bære et negativt
tall: 0f(u,v)c(u,v)0 \le f(u,v) \le c(u,v).

Dette er den betingelsen som er lettest å sjekke, og den som faktisk blir sjekket.
En kant der f(u,v)=c(u,v)f(u,v) = c(u,v), kalles mettet — den er full, og kan ikke ta
imot mer uten at noe annet endres.

Bevaringsbetingelsen

I alle andre noder enn kilden og sluket er summen av det som kommer inn, lik summen
av det som går ut.

Formelt: uVf(u,v)=wVf(v,w)\sum_{u \in V} f(u,v) = \sum_{w \in V} f(v,w) for hver
vV{s,t}v \in V \setminus \{s,t\}. Dette er betingelsen som glemmes når man «tegner på»
litt ekstra flyt et sted. Kontrollen er mekanisk: gå gjennom nodene én for én og
legg sammen begge veier.

✏️Eksempel 1: Er dette en lovlig flyt?

Vanningsanlegget har pumpehuset ss, kummene aa, bb, cc og dd, og jordet tt.
Kapasitetene, i liter per minutt, er

c(s,a) = 12    c(s,b) = 9     c(a,b) = 4    c(a,c) = 8
c(b,d) = 10    c(c,t) = 14    c(d,c) = 5    c(d,t) = 9

Driftsteknikeren foreslår denne innstillingen:

f(s,a) = 8     f(s,b) = 5     f(a,b) = 0    f(a,c) = 8
f(b,d) = 5     f(c,t) = 8     f(d,c) = 0    f(d,t) = 5

Er dette en lovlig flyt, og hva er i så fall flytverdien?

Kapasitetsbetingelsen, kant for kant:

KantffccEr 0fc0 \le f \le c?
sas \to a812ja
sbs \to b59ja
aba \to b04ja
aca \to c88ja — og kanten er mettet
bdb \to d510ja
ctc \to t814ja
dcd \to c05ja
dtd \to t59ja

Bevaringsbetingelsen, node for node (kilden og sluket er unntatt):
NodeInnUtBalanse
aa80+8=80 + 8 = 8ja
bb5+0=55 + 0 = 55ja
cc8+0=88 + 0 = 88ja
dd50+5=50 + 5 = 5ja

Begge betingelsene holder, så innstillingen er en lovlig flyt.
Flytverdien leses av ved kilden: f=f(s,a)+f(s,b)=8+5=13\lvert f\rvert = f(s,a) + f(s,b) = 8 + 5 = 13.
Kontroll ved sluket: f(c,t)+f(d,t)=8+5=13f(c,t) + f(d,t) = 8 + 5 = 13. Samme tall, som seg hør og bør.
Svar: ja, det er en lovlig flyt, og f=13\lvert f\rvert = 13.
Legg merke til at flyten ikke er maksimal. Ingenting i de to betingelsene sier
at du har presset så mye gjennom som mulig — de sier bare at det du har satt opp,
henger sammen.
📝Oppgave 1

(Innstegsoppgave, sjanger F — «stemmer dette?», altså at du svarer ja eller nei
først og deretter begrunner i én setning.) I det samme vanningsanlegget som i
Eksempel 1 foreslår en kollega å endre ett tall: f(s,b)=7f(s,b) = 7, mens alt annet står
som før.

a) Er den nye innstillingen en lovlig flyt?
b) Hvilken av de to betingelsene ryker eventuelt?

Restkapasitet, ryggkanten og restnettet (~16 min)

Bonden vil vite om det er mer å hente. Da nytter det ikke å stirre på det
opprinnelige nettet: det viser hva rørene tåler, ikke hva som er igjen. Det vi
trenger, er et nytt nett som svarer på spørsmålet «hvor mye mer kan jeg sende, og
hvilken vei?».

Svaret har to deler, og den andre delen er den alle glemmer.

Den første delen er lett: på en kant der du bruker 8 av 12, kan du sende 4 til.
Den andre delen er at du også kan angre. Sender du 8 langs sas \to a, kan du
senere ombestemme deg og redusere med opptil 8 — og det er nøyaktig som å ha en
kant den motsatte veien med kapasitet 8. Den kanten kalles ryggkanten.

Restkapasitet

Hvor mye mer som kan sendes fra uu til vv når flyten ff allerede ligger der.

Det er to tilfeller, og begge er nødvendige. På en ekte kant (u,v)E(u,v) \in E er
cf(u,v)=c(u,v)f(u,v)c_f(u,v) = c(u,v) - f(u,v): kapasiteten minus det som allerede går der. Motsatt
vei er cf(v,u)=f(u,v)c_f(v,u) = f(u,v): du kan «sende tilbake» opptil så mye som allerede går
framover. Alle andre par har cf=0c_f = 0. Engelsk fagterm: residual capacity.

Ryggkant

Kanten den motsatte veien av en kant som bærer flyt. Den finnes ikke i det
opprinnelige nettet, men i restnettet, og den representerer retten til å angre.

Går det f(u,v)=8f(u,v) = 8 fra uu til vv, har restnettet en kant fra vv til uu med
kapasitet 8. Å sende 3 langs ryggkanten betyr ikke at vann renner baklengs; det
betyr at du reduserer f(u,v)f(u,v) fra 8 til 5 og bruker de tre enhetene et bedre sted.
Uten ryggkantene kan en algoritme male seg inn i et hjørne — å glemme dem er den
vanligste feilen i hele Del 5.

Restnettet

Grafen som viser alt som fortsatt er mulig: samme noder som det opprinnelige
nettet, men med de kantene som har positiv restkapasitet.

Restnettet GfG_f har kantmengden {(u,v):cf(u,v)>0}\{(u,v) : c_f(u,v) > 0\}. Det inneholder inntil
to kanter per opprinnelig kant — framoverkanten og ryggkanten — så antallet kanter
er høyst 2E2E, altså O(E)O(E). Å bygge det tar Θ(V+E)\Theta(V+E). Merk at GfG_f
ikke er et delnett av GG: ryggkantene finnes ikke i GG.

✏️Eksempel 2: Bygg restnettet

Bygg restnettet GfG_f for flyten i Eksempel 1, og oppgi restkapasiteten på hver
kant i det.

Gå gjennom de åtte kantene og skriv opp begge restkantene for hver. En restkant med
cf=0c_f = 0 tas ikke med.

Kant (u,v)(u,v)f/cf/cFramover: cf(u,v)c_f(u,v)Ryggkant: cf(v,u)c_f(v,u)
sas \to a8/124asa \to s: 8
sbs \to b5/94bsb \to s: 5
aba \to b0/44ingen, siden f=0f = 0
aca \to c8/8ingen, kanten er mettetcac \to a: 8
bdb \to d5/105dbd \to b: 5
ctc \to t8/146tct \to c: 8
dcd \to c0/55ingen, siden f=0f = 0
dtd \to t5/94tdt \to d: 5

Restnettet har altså disse 13 kantene:
s->a: 4    s->b: 4    a->s: 8    a->b: 4
b->s: 5    b->d: 5    c->a: 8    c->t: 6
d->b: 5    d->c: 5    d->t: 4    t->c: 8
t->d: 5
To mønstre å ta med seg. En mettet kant (f=cf = c) gir ingen framoverkant,
bare ryggkant — se aca \to c. En tom kant (f=0f = 0) gir ingen ryggkant, bare
framoverkant — se aba \to b og dcd \to c. Alle kanter midt imellom gir begge deler,
og de er de vanligste.

📝Oppgave 2
Eksamensnivå, sjanger D

Definér restkapasitet cf(u,v)c_f(u,v) med egne ord, og forklar
hva ryggkanten cf(v,u)=f(u,v)c_f(v,u) = f(u,v) representerer.

📝Oppgave 3
Eksamensnivå, sjanger C

Bruk flyten fra Eksempel 1.

a) Oppgi cf(s,a)c_f(s,a) og cf(a,s)c_f(a,s).
b) Oppgi alle restkanter ut av node dd, med restkapasitet.
c) Hvorfor finnes det ingen kant fra aa til cc i restnettet?

Forøkende sti (~8 min)

Nå er spørsmålet «er det mer å hente?» blitt til et rent grafspørsmål: finnes det
en vei fra ss til tt i restnettet?
Finnes den, kan du sende mer. Finnes den
ikke, er du ferdig.

Hvor mye du kan sende langs veien, bestemmes av det svakeste leddet — den minste
restkapasiteten på veien. Den kalles flaskehalsen, og den er alltid et ledd i
svaret ditt.

— naturlig pausepunkt —

Forøkende sti

En vei fra kilden til sluket i restnettet, altså en rekke kanter som alle har
restkapasitet igjen.

Formelt er det en enkel sti fra ss til tt i GfG_f. En slik sti kan bestå av både
framoverkanter og ryggkanter, og det er helt i orden — en ryggkant på stien betyr
bare at en tidligere beslutning delvis reverseres. Engelsk fagterm:
augmenting path. Å lete etter en tar Θ(V+E)\Theta(V+E) med BFS.

Flaskehalsen på en forøkende sti

Den minste restkapasiteten langs stien — altså akkurat så mye du kan sende før det
første leddet går tomt.

For en sti pp er flaskehalsen minimum av cf(u,v)c_f(u,v) over kantene på pp. Forøker
du med dette tallet, blir minst én kant på stien mettet (eller minst én ryggkant
tømt), og stien forsvinner fra restnettet. Flaskehalsen er alltid et positivt tall,
siden alle kanter i GfG_f har cf>0c_f > 0.

✏️Eksempel 3: Er det mer å hente?

Bruk restnettet fra Eksempel 2. Finn en forøkende sti med BFS fra ss, og oppgi
flaskehalsen.

BFS fra ss i restnettet finner nodene lagvis. Med nodene i rekkefølgen
s,a,b,c,d,ts, a, b, c, d, t blir lagene slik:

LagNoderNådd via
0ss
1aa, bbsas \to a (4), sbs \to b (4)
2ddbdb \to d (5)
3cc, ttdcd \to c (5), dtd \to t (4)

Sluket tt ble nådd i lag 3, via dd. Følger vi forgjengerne bakover, får vi
sbdts \to b \to d \to t
Flaskehalsen er den minste restkapasiteten langs stien: min{4,5,4}=4\min\{4, 5, 4\} = 4.
Svar: stien sbdts \to b \to d \to t er forøkende, og flaskehalsen er 4.
Det betyr at flyten kan økes fra 13 til minst 17. Hvordan man gjør det systematisk

— og hvor mye man til slutt lander på — er innholdet i

kap. 5.2.

Merk at det finnes flere forøkende stier i dette restnettet;

sabdts \to a \to b \to d \to t er også en. BFS finner den korteste, og det er

ikke tilfeldig at vi bruker nettopp den — men det argumentet hører hjemme i neste
kapittel.

📝Oppgave 4
Eksamensnivå, sjanger C

I restnettet fra Eksempel 2 antar vi at
kum dd er sperret for vedlikehold, slik at ingen sti får gå gjennom dd.

a) Finnes det fortsatt en forøkende sti fra ss til tt? Oppgi en i så fall.
b) Hva er flaskehalsen på stien du fant?

Snitt: hvor sitter proppen? (~13 min)

Det andre spørsmålet var hvor proppen sitter. Tenk deg at du deler
vanningsanlegget i to med en strek: pumpehuset på den ene siden, jordet på den
andre. Alt vann som skal fram, må krysse streken. Da kan flytverdien aldri være
større enn den samlede kapasiteten på rørene som krysser — den ene veien.

Den streken er et snitt, og den er bokas verktøy for å bevise at en flyt er
maksimal. Uten den ville «jeg fant ikke mer» vært det eneste argumentet du hadde.

Snitt

En oppdeling av alle nodene i to deler, der kilden ligger i den ene og sluket i den
andre.

Et snitt (S,T)(S,T) er en partisjon av VV med sSs \in S og tTt \in T, der SS og TT
til sammen utgjør VV og ikke har noen node felles. Hver node er i nøyaktig én av
delene. Det er ingen krav om at delene skal være like store eller henge sammen:
S={s}S = \{s\} er et fullgodt snitt. Et nett med nn noder har 2n22^{n-2} ulike snitt.

Snittkapasitet

Summen av kapasitetene på kantene som går fra SS-siden til TT-siden — og bare de.

c(S,T)=uSvTc(u,v)c(S,T) = \sum_{u \in S} \sum_{v \in T} c(u,v). Kanter som går den andre veien,
fra TT til SS, teller ikke med, og kanter som går internt i SS eller internt
i TT, teller heller ikke. Dette er den enkeltdetaljen som oftest gir feil svar på
en snittoppgave.

Snittflyt

Netto hvor mye som faktisk krysser snittet: flyten fra SS til TT minus flyten fra
TT til SS.

I motsetning til kapasiteten teller snittflyten begge retninger, men med
motsatt fortegn: du summerer f(u,v)f(u,v) for uSu \in S, vTv \in T, og trekker fra
f(v,u)f(v,u) for de samme parene. Blander du de to reglene, får du feil på begge
regnestykkene.

📜Snittlemmaet: all flyt må krysse ethvert snitt
Påstand. For enhver lovlig flyt ff og ethvert snitt (S,T)(S,T) i et flytnett
gjelder

f(S,T)=fog dermedfc(S,T).f(S,T) = \lvert f\rvert \qquad \text{og dermed} \qquad \lvert f\rvert \le c(S,T).

Hvorfor det første leddet holder. Flytverdien er netto ut av ss. Legger du til
bevaringsbetingelsen for hver av de andre nodene i SS — der inn og ut er like
store, altså netto null — endrer ikke summen seg. Det du sitter igjen med, er netto
flyt ut av hele mengden SS, og det er nøyaktig f(S,T)f(S,T).

Hvorfor det andre leddet følger. Netto flyt fra SS til TT kan ikke være
større enn den samlede kapasiteten på kantene fra SS til TT, siden hver enkelt
kant er begrenset av f(u,v)c(u,v)f(u,v) \le c(u,v), og flyten den andre veien bare trekker
fra.

Hva dette gir deg på eksamen. Ethvert snitt er en øvre grense for
flytverdien. Finner du en flyt og et snitt med samme tall, er du ferdig: flyten kan
ikke bli større, og snittet kan ikke bli mindre. Det er den korteste gyldige
begrunnelsen som finnes for at en flyt er maksimal.

✏️Eksempel 4: To snitt i det samme nettet

Bruk vanningsanlegget og flyten fra Eksempel 1, der f=13\lvert f\rvert = 13.

a) Regn ut c(S,T)c(S,T) og f(S,T)f(S,T) for S={s,a,b}S = \{s,a,b\}.
b) Regn ut det samme for S={s,a,c}S = \{s,a,c\}.
c) Hva kan du konkludere om maks-flyten i nettet?

a) S={s,a,b}S = \{s,a,b\}, altså T={c,d,t}T = \{c,d,t\}.

Kanter fra SS til TT: aca \to c (kapasitet 8) og bdb \to d (kapasitet 10). Kanter
fra TT til SS: ingen.

c(S,T)=8+10=18,f(S,T)=8+50=13.c(S,T) = 8 + 10 = 18, \qquad f(S,T) = 8 + 5 - 0 = 13.

b) S={s,a,c}S = \{s,a,c\}, altså T={b,d,t}T = \{b,d,t\}.

Kanter fra SS til TT: sbs \to b (9), aba \to b (4) og ctc \to t (14). Kanten
dcd \to c går fra TT til SS: den teller ikke i kapasiteten, men flyten på den
skal trekkes fra i snittflyten.

c(S,T)=9+4+14=27,f(S,T)=(5+0+8)0=13.c(S,T) = 9 + 4 + 14 = 27, \qquad f(S,T) = (5 + 0 + 8) - 0 = 13.

Flyten på dcd \to c er 0, så trekket blir null her — men regelen er det du blir
testet på.

c) Begge snittene gir samme snittflyt, 13, akkurat som snittlemmaet lover. Og
begge er øvre grenser, så maks-flyten er høyst 18. Den minste øvre grensen vi har
funnet, er altså 18, mens den beste flyten vi har funnet, er 13. Svaret ligger et
sted mellom — og i kap. 5.2 viser det seg å være nøyaktig
18.

På eksamen leverer du bare de fire tallene og konklusjonen — utregningen over er
her for å vise hvordan du kommer dit.

📝Oppgave 5
Eksamensnivå, sjanger C

Fortsatt vanningsanlegget fra Eksempel 1,
med flyten som har f=13\lvert f\rvert = 13.

a) Regn ut c(S,T)c(S,T) for S={s}S = \{s\}.
b) Regn ut c(S,T)c(S,T) for S={s,a,b,c,d}S = \{s,a,b,c,d\}.
c) Hvilken av de to gir den strammeste øvre grensen for maks-flyten?

📝Oppgave 6
Eksamensnivå, sjanger F

Avgjør for hver påstand om den er
sann eller usann, og begrunn hver med én setning.

a) «Et snitt (S,T)(S,T) må dele nodene i to like store deler.»
b) «I c(S,T)c(S,T) teller vi alle kanter som krysser snittet, uansett retning.»
c) «For enhver lovlig flyt og ethvert snitt er fc(S,T)\lvert f\rvert \le c(S,T)

Heltallsteoremet — derfor blir flyt et tilordningsverktøy (~6 min)

Til nå har vi snakket om liter i minuttet, der halve enheter er meningsfulle. Men de
aller fleste eksamensoppgavene handler om noe annet: vikarer til vakter,
containere til båter, studenter til praksisplasser. Der gir ikke «0,4 vikarer på
nattevakten» noen mening.

Heldigvis trenger du ikke å gjøre noe spesielt for å unngå det.

📜Heltallsteoremet
Påstand. Er alle kapasitetene i flytnettet heltall, finnes det en maksimal flyt
der f(u,v)f(u,v) er et heltall for hver kant. Ford-Fulkerson-metoden — se
kap. 5.2 — produserer en slik flyt.

Hvorfor. Metoden starter med flyten som er 0 overalt, og den er heltallig. I
hver runde er alle restkapasiteter heltall, så flaskehalsen — som er den minste av
dem — er også et heltall. Forøkningen legger til eller trekker fra et heltall på
hver kant på stien. Altså er flyten heltallig etter hver eneste runde, og dermed
også til slutt.

Hva dette gir deg på eksamen. Det er dette som gjør maks-flyt til et
tilordningsverktøy. Modellerer du «hvem tar hvilken vakt» som et flytnett med
kapasitet 1 på hver person–vakt-kant, garanterer teoremet at maks-flyten kan velges
slik at hver slik kant har flyt 0 eller 1. Og en kant med flyt 1 er en ekte
beslutning: denne personen tar den vakten. Uten heltallsteoremet satt du igjen med
et tall, ikke med en vaktliste.

Si dette eksplisitt når du besvarer en designoppgave. Det er ett av de fem leddene et
fullt designsvar skal ha, og det er billig å skrive: «kapasitetene er heltall, så
heltallsteoremet gir en heltallig maks-flyt, og kantene med flyt 1 er selve
tilordningen».

📝Oppgave 7
Eksamensnivå, sjanger F

En medstudent modellerer fordelingen
av seks vikarer på fire vakter som et flytnett der hver vikar–vakt-kant har
kapasitet 1, og påstår: «Maks-flyt kan gi meg et desimaltall her, så jeg må runde av
til slutt.»

a) Er påstanden riktig?
b) Begrunn svaret med navnet på resultatet som avgjør saken.

📝Oppgave 8
Eksamensnivå, sjanger F

I
vanningsanlegget fra Eksempel 1 hevder driftslederen at han har funnet en innstilling
med f=18\lvert f\rvert = 18, og at ingen kan gjøre det bedre.

a) Kan flytverdien 18 være riktig, gitt kapasitetene? Begrunn med et snitt.
b) Hvordan kan han bevise at 18 ikke kan slås, uten å prøve alle
innstillinger?
c) Hva må da gjelde for de kantene som krysser snittet han bruker?

Begrepsbank

Begrepsbanken er flashcard- og repetisjonsstoff — den gjentar det du nettopp har
lest. Hopp trygt over ved førstegangslesing; tidsanslaget for kapitlet gjelder
kjernestoffet.

Flytverdien

Netto hvor mye som forlater kilden — og dermed også netto hvor mye som ankommer
sluket.

Regnestykket er summen av f(s,v)f(s,v) over alle noder, minus summen av f(v,s)f(v,s).
Trekket for flyt inn i ss er sjelden aktuelt, men det hører med i definisjonen. Å
lese av flytverdien tar Θ(V)\Theta(V) når du har nabolista til ss. Kontroller alltid
mot sluket: får du et annet tall der, har du brutt bevaringsbetingelsen et sted.

Mettet kant

En kant der flyten er lik kapasiteten, altså f(u,v)=c(u,v)f(u,v) = c(u,v).

En mettet kant har ingen framoverkant i restnettet, bare ryggkant. I et min-snitt er
alle kantene fra SS til TT mettet — det er selve kjennetegnet på at snittet er
stramt.

Nullflyten

Flyten der f(u,v)=0f(u,v) = 0 for hver kant. Den er alltid lovlig, og den har verdi 0.

Nullflyten er startpunktet for alle flytalgoritmer. Restnettet til nullflyten er det
opprinnelige nettet uten ryggkanter, siden ingen kant bærer noe å angre på.

Maks-flyt-problemet

Å finne en lovlig flyt med størst mulig verdi i et gitt flytnett.

Problemet er løsbart i polynomisk tid — Edmonds-Karp klarer det i O(VE2)O(VE^2), se
kap. 5.2. Det finnes alltid en optimal løsning, og med
heltallige kapasiteter finnes det alltid en heltallig optimal løsning. Bruk
maks-flyt når oppgaven handler om å presse mest mulig gjennom et nett med
kapasiteter, eller om å tilordne én mengde til en annen.

Min-snitt

Et snitt med minst mulig snittkapasitet blant alle snitt i nettet.

Snittlemmaet gir at fc(S,T)\lvert f\rvert \le c(S,T) for alle par av flyt og snitt, så
maks-flyten er høyst så stor som det minste snittet. At de to faktisk er like —
maks-flyt/min-snitt-teoremet — vises i kap. 5.2. Et nett kan
ha flere min-snitt med samme kapasitet, og derfor ber oppgaver om «et
min-snitt», ikke «det».

Begrepene på ett kort

BegrepHva det erVanligste feil
Flyttall på hver kant som oppfyller kapasitet og bevaringå sjekke bare kapasiteten
Flytverdiennetto ut av sså summere alle kanter i nettet
Restkapasitet cf(u,v)c_f(u,v)c(u,v)f(u,v)c(u,v)-f(u,v) framover, f(u,v)f(u,v) bakoverå glemme det andre leddet
Restnettet GfG_fkantene med cf>0c_f > 0, inntil 2E2E stykkerå tegne det uten ryggkanter
Forøkende stivei fra ss til tt i GfG_få lete i GG i stedet for i GfG_f
Flaskehalsminste cfc_f på stienå bruke kapasiteten i stedet for restkapasiteten
Snitt (S,T)(S,T)partisjon med sSs \in S, tTt \in Tå glemme kravet om hvor ss og tt ligger
Snittkapasitet c(S,T)c(S,T)sum av cc fra SS til TTå ta med kanter fra TT til SS
Snittflyt f(S,T)f(S,T)flyt fram minus flyt tilbakeå bruke kapasitetsregelen her
Heltallsteoremetheltallige kapasiteter gir heltallig maks-flytå tro at man må runde av
Repetisjonsoppgaver

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.

Skolesaga er en uavhengig læringsressurs og er ikke tilknyttet eller godkjent av Norges teknisk-naturvitenskapelige universitet. Dette er ikke offisielt studiemateriell. Les mer.