5.1 Flytnett, restnett og snitt
Flytnett, restkapasitet og restnett, snitt `(S,T)`, og heltallsteoremet — begrepene alle flytoppgaver hviler på.
Maks-flyt er et av de aller sikreste temaene i dette faget: temaet er registrert
i 94 % (16 av de 17 settene i grunnlaget). Dette kapitlet dekker begrepene alt
det andre hviler på — flytnett, restnett, snitt og heltallsteoremet.
Begrepene testes i to sjangre. Sjanger D — definisjon «med egne ord», altså at
du skal gi én presis setning som treffer hovedpoenget («definér restkapasitet»).
Og sjanger F — «stemmer dette?», altså en påstand du skal svare ja eller nei
på og deretter begrunne i én setning («snittkapasiteten teller alle kanter som
krysser snittet»).
Prioriteten er høyeste prioritet — dette må sitte. Grunnen er praktisk: de
åpne designoppgavene helt til slutt i settet bruker maks-flyt som verktøy, og du
kommer ikke i gang med dem hvis restnettet og snittet er uklare. Eksamen er uten
hjelpemidler, så definisjonene skal sitte i hodet.
Slik er kapitlet lagt opp (55 min):
| # | Innhold | Tid |
|---|---|---|
| 1 | Flytnett, og hva en lovlig flyt er | ca. 12 min |
| 2 | Restkapasitet, ryggkanten og restnettet | ca. 16 min |
| 3 | Forøkende sti | ca. 8 min |
| 4 | Snitt, snittkapasitet og snittflyt | ca. 13 min |
| 5 | Heltallsteoremet, og hvorfor det gjør flyt til et tilordningsverktøy | ca. 6 min |
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 til .
- Mengdelære — hvis notasjonen , «» og «en
partisjon av » 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.
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.
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 med en kilde , et sluk
og en kapasitetsfunksjon som gir hver kant et tall
. Finnes det ingen kant fra til , setter vi . Vi
antar at hver node ligger på en vei fra til ; noder som ikke gjør det, kan
aldri bære flyt og kan strykes.
Kilden er noden all flyt starter i, og sluket 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 , er det samme som det som
netto ankommer .
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 og oppfyller
kapasitetsbetingelsen for alle kanter, og
bevaringsbetingelsen i alle noder unntatt og . Flytverdien er
, altså netto ut
av kilden. Maks-flyt-problemet er å finne en flyt med størst mulig verdi.
Ingen kant får bære mer enn kapasiteten sin, og ingen kant får bære et negativt
tall: .
Dette er den betingelsen som er lettest å sjekke, og den som faktisk blir sjekket.
En kant der , kalles mettet — den er full, og kan ikke ta
imot mer uten at noe annet endres.
I alle andre noder enn kilden og sluket er summen av det som kommer inn, lik summen
av det som går ut.
Formelt: for hver
. 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.
Vanningsanlegget har pumpehuset , kummene , , og , og jordet .
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) = 9Driftsteknikeren 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) = 5Er dette en lovlig flyt, og hva er i så fall flytverdien?
| Kant | Er ? | ||
|---|---|---|---|
| 8 | 12 | ja | |
| 5 | 9 | ja | |
| 0 | 4 | ja | |
| 8 | 8 | ja — og kanten er mettet | |
| 5 | 10 | ja | |
| 8 | 14 | ja | |
| 0 | 5 | ja | |
| 5 | 9 | ja |
Bevaringsbetingelsen, node for node (kilden og sluket er unntatt):
| Node | Inn | Ut | Balanse |
|---|---|---|---|
| 8 | ja | ||
| 5 | ja | ||
| 8 | ja | ||
| 5 | ja |
Begge betingelsene holder, så innstillingen er en lovlig flyt.
Flytverdien leses av ved kilden: .
Kontroll ved sluket: . Samme tall, som seg hør og bør.
Svar: ja, det er en lovlig flyt, og .
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.
(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: , 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 , 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.
Hvor mye mer som kan sendes fra til når flyten allerede ligger der.
Det er to tilfeller, og begge er nødvendige. På en ekte kant er
: kapasiteten minus det som allerede går der. Motsatt
vei er : du kan «sende tilbake» opptil så mye som allerede går
framover. Alle andre par har . Engelsk fagterm: residual capacity.
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 fra til , har restnettet en kant fra til med
kapasitet 8. Å sende 3 langs ryggkanten betyr ikke at vann renner baklengs; det
betyr at du reduserer 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.
Grafen som viser alt som fortsatt er mulig: samme noder som det opprinnelige
nettet, men med de kantene som har positiv restkapasitet.
Restnettet har kantmengden . Det inneholder inntil
to kanter per opprinnelig kant — framoverkanten og ryggkanten — så antallet kanter
er høyst , altså . Å bygge det tar . Merk at
ikke er et delnett av : ryggkantene finnes ikke i .
Bygg restnettet 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
tas ikke med.
| Kant | Framover: | Ryggkant: | |
|---|---|---|---|
| 8/12 | 4 | : 8 | |
| 5/9 | 4 | : 5 | |
| 0/4 | 4 | ingen, siden | |
| 8/8 | ingen, kanten er mettet | : 8 | |
| 5/10 | 5 | : 5 | |
| 8/14 | 6 | : 8 | |
| 0/5 | 5 | ingen, siden | |
| 5/9 | 4 | : 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: 5To mønstre å ta med seg. En mettet kant () gir ingen framoverkant,bare ryggkant — se . En tom kant () gir ingen ryggkant, bare
framoverkant — se og . Alle kanter midt imellom gir begge deler,
og de er de vanligste.
Definér restkapasitet med egne ord, og forklar
hva ryggkanten representerer.
Bruk flyten fra Eksempel 1.
a) Oppgi og .
b) Oppgi alle restkanter ut av node , med restkapasitet.
c) Hvorfor finnes det ingen kant fra til i restnettet?
Fire feil koster mest i dette kapitlet, og den første er den desidert dyreste.
- Å glemme ryggkanten. Et restnett uten kanter den motsatte veien er ikke et
restnett. Konsekvensen er ikke bare en tegnefeil: algoritmen i
kap. 5.2 kan da låse seg på en flyt som ikke er
maksimal. Kontrollen: hver kant med skal gi to kanter i
. Tell dem.
- Å blande snittkapasitet med snittflyt. Kapasiteten teller bare
kanter fra til , og bruker . Snittflyten teller flyten begge
veier og trekker fra det som går tilbake. To ulike regnestykker på det samme
snittet.
- Å tro at snittet må dele nettet i to like store deler. er en helt
vanlig partisjon. er et lovlig snitt, og ofte et av de interessante.
- Å glemme kravet og . Uten det er «snittet» bare en
vilkårlig oppdeling, og ingen av setningene om snitt gjelder.
Og den stille: å tro at en lovlig flyt er en maksimal flyt. De to betingelsene
sier ingenting om at du har presset gjennom så mye som mulig. Det er nettopp derfor
vi trenger 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 til 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 —
En vei fra kilden til sluket i restnettet, altså en rekke kanter som alle har
restkapasitet igjen.
Formelt er det en enkel sti fra til i . 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 med BFS.
Den minste restkapasiteten langs stien — altså akkurat så mye du kan sende før det
første leddet går tomt.
For en sti er flaskehalsen minimum av over kantene på . 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 har .
Bruk restnettet fra Eksempel 2. Finn en forøkende sti med BFS fra , og oppgi
flaskehalsen.
BFS fra i restnettet finner nodene lagvis. Med nodene i rekkefølgenblir lagene slik:
| Lag | Noder | Nådd via |
|---|---|---|
| 0 | — | |
| 1 | , | (4), (4) |
| 2 | (5) | |
| 3 | , | (5), (4) |
Sluket ble nådd i lag 3, via . Følger vi forgjengerne bakover, får vi
Flaskehalsen er den minste restkapasiteten langs stien: .
Svar: stien 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
Merk at det finnes flere forøkende stier i dette restnettet;
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.
I restnettet fra Eksempel 2 antar vi at
kum er sperret for vedlikehold, slik at ingen sti får gå gjennom .
a) Finnes det fortsatt en forøkende sti fra til ? 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.
En oppdeling av alle nodene i to deler, der kilden ligger i den ene og sluket i den
andre.
Et snitt er en partisjon av med og , der og
til sammen utgjør 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:
er et fullgodt snitt. Et nett med noder har ulike snitt.
Summen av kapasitetene på kantene som går fra -siden til -siden — og bare de.
. Kanter som går den andre veien,
fra til , teller ikke med, og kanter som går internt i eller internt
i , teller heller ikke. Dette er den enkeltdetaljen som oftest gir feil svar på
en snittoppgave.
Netto hvor mye som faktisk krysser snittet: flyten fra til minus flyten fra
til .
I motsetning til kapasiteten teller snittflyten begge retninger, men med
motsatt fortegn: du summerer for , , og trekker fra
for de samme parene. Blander du de to reglene, får du feil på begge
regnestykkene.
gjelder
Hvorfor det første leddet holder. Flytverdien er netto ut av . Legger du til
bevaringsbetingelsen for hver av de andre nodene i — 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 , og det er nøyaktig .
Hvorfor det andre leddet følger. Netto flyt fra til kan ikke være
større enn den samlede kapasiteten på kantene fra til , siden hver enkelt
kant er begrenset av , 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.
Bruk vanningsanlegget og flyten fra Eksempel 1, der .
a) Regn ut og for .
b) Regn ut det samme for .
c) Hva kan du konkludere om maks-flyten i nettet?
Kanter fra til : (kapasitet 8) og (kapasitet 10). Kanter
fra til : ingen.
b) , altså .
Kanter fra til : (9), (4) og (14). Kanten
går fra til : den teller ikke i kapasiteten, men flyten på den
skal trekkes fra i snittflyten.
Flyten på 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.
Fortsatt vanningsanlegget fra Eksempel 1,
med flyten som har .
a) Regn ut for .
b) Regn ut for .
c) Hvilken av de to gir den strammeste øvre grensen for maks-flyten?
Avgjør for hver påstand om den er
sann eller usann, og begrunn hver med én setning.
a) «Et snitt må dele nodene i to like store deler.»
b) «I teller vi alle kanter som krysser snittet, uansett retning.»
c) «For enhver lovlig flyt og ethvert snitt er .»
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.
der er et heltall for hver kant.
Ford-Fulkerson-metoden — sekap. 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».
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.
I
vanningsanlegget fra Eksempel 1 hevder driftslederen at han har funnet en innstilling
med , 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.
Netto hvor mye som forlater kilden — og dermed også netto hvor mye som ankommer
sluket.
Regnestykket er summen av over alle noder, minus summen av .
Trekket for flyt inn i er sjelden aktuelt, men det hører med i definisjonen. Å
lese av flytverdien tar når du har nabolista til . Kontroller alltid
mot sluket: får du et annet tall der, har du brutt bevaringsbetingelsen et sted.
En kant der flyten er lik kapasiteten, altså .
En mettet kant har ingen framoverkant i restnettet, bare ryggkant. I et min-snitt er
alle kantene fra til mettet — det er selve kjennetegnet på at snittet er
stramt.
Flyten der 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å.
Å 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 , 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.
Et snitt med minst mulig snittkapasitet blant alle snitt i nettet.
Snittlemmaet gir at 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
| Begrep | Hva det er | Vanligste feil |
|---|---|---|
| Flyt | tall på hver kant som oppfyller kapasitet og bevaring | å sjekke bare kapasiteten |
| Flytverdien | netto ut av | å summere alle kanter i nettet |
| Restkapasitet | framover, bakover | å glemme det andre leddet |
| Restnettet | kantene med , inntil stykker | å tegne det uten ryggkanter |
| Forøkende sti | vei fra til i | å lete i i stedet for i |
| Flaskehals | minste på stien | å bruke kapasiteten i stedet for restkapasiteten |
| Snitt | partisjon med , | å glemme kravet om hvor og ligger |
| Snittkapasitet | sum av fra til | å ta med kanter fra til |
| Snittflyt | flyt fram minus flyt tilbake | å bruke kapasitetsregelen her |
| Heltallsteoremet | heltallige kapasiteter gir heltallig maks-flyt | å tro at man må runde av |
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.