Tilbake
5.1

5.1 Grafrepresentasjon og grunnbegreper

Grafer som `G=(V,E)`, nabolister vs. nabomatrise, rettet/urettet, vektet/uvektet, inngrad/utgrad — og hvorfor representasjonsvalg påvirker kjøretid.

45 min
8 oppgaver
Grafrepresentasjongrunnbegreper
Din fremgang i kapitlet
0 / 8 oppgaver

Forkunnskaper

- kap. 1.2 — løkketelling. Alle kjøretidene i dette
kapitlet leses ut av hvor mange celler eller listeoppføringer en løkke må
innom.
- kap. 1.1OO-notasjon. Det nye her er at kjøretiden
avhenger av to størrelser samtidig, antall noder og antall kanter, og
ikke av én enkelt nn. Uttrykk som O(V+E)O(|V| + |E|) er derfor helt vanlige
fra nå av.

Er det lenge siden du har sett objekter eller mengder, hjelper disse to:

- Klasser og objekter: class, __init__ og self
en node som et objekt med felter. Boka skriver v.naboer og senere
v.visited, og det er nøyaktig den tenkemåten.
- Mengdelære — mengdenotasjonen bak G=(V,E)G = (V, E). Helt
valgfritt: du trenger bare å vite at VV og EE er to samlinger av ting.

Notasjons- og pseudokodeliste

Løkke 1 — grafen som modell (ca. 10 min)

Fibernettet i en liten kommune består av fem koblingsskap, og mellom noen av
dem er det gravd ned en kabel. Spørsmålet driftsvakta stiller klokka tre om
natta, er enkelt: finnes det i det hele tatt en vei fra skap A til skap E?

For å svare på det trenger hun ikke å vite hvor skapene står, hvor lang
kabelen er, eller hvem som gravde den ned. Hun trenger bare to ting: hvilke
skap finnes, og hvilke par av skap er koblet sammen.

Det som blir igjen når du stryker alt annet, er en graf. Grafen er ikke
et bilde — den er en liste over hva som henger sammen med hva. Tegningen er
bare en måte å se den på, og den samme grafen kan tegnes på uendelig mange
måter uten å bli en annen graf.

Graf

Et par G=(V,E)G = (V, E), der VV er en mengde noder og EE er en mengde
kanter. Hver kant forbinder to noder.

Grafens to størrelser er V|V| (antall noder) og E|E| (antall kanter), og
alle kjøretider for grafalgoritmer oppgis i begge — for eksempel
O(V+E)O(|V| + |E|). Å oppgi en grafkjøretid som «O(n)O(n)» uten å si hva nn er,
er en fast trekkgrunn.

Urettet graf

En graf der kantene ikke har retning: kanten (u,v)(u, v) er den samme som
(v,u)(v, u), og du kan gå begge veier.

Fibernett, veinett uten enveiskjøring og vennelister er urettede. I en
naboliste betyr det at hver kant står to ganger — én gang under hver av
de to endene.

Rettet graf

En graf der hver kant har en retning: (u,v)(u, v) går fra uu til vv, og sier
ingenting om veien tilbake.

Lenker mellom nettsider, avhengigheter mellom programvarepakker og
enveiskjørte gater er rettede. Her deles graden i inngrad og utgrad,
og en naboliste inneholder hver kant nøyaktig én gang.

Vektet graf

En graf der hver kant i tillegg har et tall — en vekt — som kan bety
avstand, reisetid, kostnad eller kapasitet.

En uvektet graf er en der alle kanter teller likt. Skillet er avgjørende for
hvilken algoritme som er riktig: i en uvektet graf finner en enkel
traversering korteste vei målt i antall kanter, mens vektede grafer krever
andre verktøy (de kommer i Del 6). Alle grafene i Del 5 er uvektede.

Enkel graf

En graf uten løkker (en kant fra en node til seg selv) og uten
parallelle kanter (to eller flere kanter mellom det samme nodeparet).

Nesten alt du møter på eksamen er enkelt, og det er derfor grensen
EV(V1)2\displaystyle |E| \le \frac{|V| \cdot (|V| - 1)}{2} gjelder. Merk at «enkel» ikke sier
noe som helst om grafen er sammenhengende, eller om den har sykler — det er
tre uavhengige spørsmål, og en avkryssingsoppgave spør gjerne om alle tre på
samme graf.

✏️Eksempel 1: Fra historie til graf

Seks værstasjoner i en fjellkommune er koblet sammen med radiolinjer.
Stasjon A når B og C. Stasjon B når i tillegg D og E. Stasjon C når i
tillegg F. Ingen andre par kan snakke direkte sammen, og alle linjene
virker begge veier.

Skriv opp VV, EE, V|V| og E|E|, sett opp nabolistene, og regn ut graden
til hver stasjon.

Nodene: V={A,B,C,D,E,F}V = \{A, B, C, D, E, F\}, altså V=6|V| = 6.

Kantene — hver linje nevnes én gang, uten retning:
E={(A,B), (A,C), (B,D), (B,E), (C,F)}E = \{(A,B),\ (A,C),\ (B,D),\ (B,E),\ (C,F)\}, altså E=5|E| = 5.

Nabolistene. Fordi grafen er urettet, står hver linje under begge
endene sine:

A: B, C
B: A, D, E
C: A, F
D: B
E: B
F: C

Vi kaller denne grafen U5 og kommer tilbake til den flere ganger i
kapitlet.

Gradene:

NodeABCDEF
grad\text{grad}232111

Kontrollregningen som alltid lønner seg: gradsummen er
2+3+2+1+1+1=102 + 3 + 2 + 1 + 1 + 1 = 10, og 2E=25=102|E| = 2 \cdot 5 = 10. Stemmer.

Legg merke til at nabolistene har 10 oppføringer for 5 kanter. Det
er ikke sløsing — det er hele poenget med en urettet naboliste, og det er

grunnen til at plassforbruket skrives O(V+E)O(|V| + |E|) og ikke O(E)O(|E|): du
trenger én listeoverskrift per node i tillegg, også for noder uten naboer.
Fellenote. Fella her er å telle hver kant to ganger og få E=10|E| = 10.
Antall kanter er antall linjer, ikke antall listeoppføringer.

📝Oppgave 1

(Innstegsoppgave, sjanger F — matrise- og tabellavkryssing, altså at du fyller
ut en tabell med grafens egenskaper.) Et vannverk har åtte pumpestasjoner
koblet med rør. Nabolistene er:

A: B, C
B: A, D
C: A, D, E
D: B, C, F
E: C, F
F: D, E, G
G: F, H
H: G

a) Hvor mange noder og hvor mange kanter har grafen?
b) Sett opp graden til hver node.
c) Kontrollér svaret ditt med gradsummen.

Løkke 2 — grad, sti, sykel, sammenheng (ca. 12 min)

— naturlig pausepunkt —

Nå kommer de fire begrepene som avkryssingsoppgavene er bygget av. De er
lette å forstå og lette å blande sammen under tidspress, og det er nettopp
derfor de spørres om.

Tenk igjen på fibernettet. Driftsvakta har egentlig tre ulike spørsmål:

1. Kommer jeg fram? Det handler om sti og om grafen er
sammenhengende.
2. Finnes det en omvei jeg kan bruke hvis en kabel ryker? Det handler om
sykel.
3. Hvor mange kabler har jeg egentlig råd til? Det handler om grad og
om nettet er et tre.

Legg merke til at et nett uten sykler er det billigste som fortsatt henger
sammen — og samtidig det mest sårbare, siden hver eneste kabel er kritisk.
Det er hele forskjellen på et tre og en graf med sykler, sagt på
driftsvaktas språk.

Grad

Antall kanter som møter en node, skrevet grad(v)\text{grad}(v). I en naboliste er
det ganske enkelt lengden på nodens egen linje.

Gradsummen over alle noder er alltid 2E2|E| i en urettet graf, fordi hver
kant har to ender. Bruk det som kontrollregning: får du en gradsum som er et
oddetall, har du telt feil.

Inngrad og utgrad

I en rettet graf splittes graden i to: inngrad(v)\text{inngrad}(v) er antall
kanter som peker inn til vv, og utgrad(v)\text{utgrad}(v) er antall kanter som
peker ut fra vv.

Her er summen inngrad(v)=utgrad(v)=E\sum \text{inngrad}(v) = \sum \text{utgrad}(v) = |E|
altså E|E|, ikke 2E2|E|, fordi hver rettet kant bidrar med én inngrad og én
utgrad. Å bruke 2E2|E|-regelen på en rettet graf er en klassisk bom. Inngrad
0 og utgrad 0 blir dessuten helt sentrale begreper i
kap. 5.4.

Sti

En rekke noder der hvert par etter hverandre er forbundet med en kant, og
ingen node gjentas. Lengden på stien er antall kanter i den, ikke antall
noder.

En sti fra uu til vv er svaret på «kommer jeg fram?». At det finnes en sti
sier ingenting om at den er kortest — å finne den korteste er en egen
oppgave, og verktøyet kommer i kap. 5.2.

Sykel

En sti som starter og ender i samme node, og som ellers ikke gjentar noen
node. I en urettet graf krever en sykel minst tre kanter, siden det å gå fram
og tilbake over den samme kanten ikke teller.

En sykel betyr at det finnes minst to ulike veier mellom to av nodene — altså
en omvei. En graf uten sykler kalles asyklisk.

Sammenhengende graf

En urettet graf der det finnes en sti mellom hvert par av noder.

Er den ikke sammenhengende, deler den seg i flere biter. Merk at én eneste
node uten kanter er nok til å ødelegge sammenhengen: en graf med 500 noder
som alle henger sammen, pluss én ensom node, er ikke sammenhengende.

Sammenhengende komponent

En maksimal bit av grafen der alle nodene kan nå hverandre. En
sammenhengende graf har nøyaktig én komponent; en graf med tre atskilte øyer
har tre.

En node helt uten kanter er en komponent for seg selv. Å telle
komponenter er en egen algoritmeoppgave, og den kommer i
kap. 5.3 — her skal du bare kunne se dem.

Tre (som graf)

En urettet graf som er sammenhengende og uten sykler.

Kjennetegnet du kan regne på: et tre har nøyaktig E=V1|E| = |V| - 1 kanter.
Begge kravene må være oppfylt — en graf med V1|V| - 1 kanter som ikke henger
sammen, er ikke et tre. Legger du én kant til et tre, får du nøyaktig én
sykel; fjerner du én kant, faller treet i to komponenter.

📜Gradsummen og trekjennetegnet
To resultater som skal sitte uten oppslag, fordi de gjør avkryssingsoppgaver
til regnestykker i stedet for gjetting.

1. Gradsummen (urettet graf):

vVgrad(v)=2E\sum_{v \in V} \text{grad}(v) = 2|E|

Grunnen i én setning: hver kant har to ender, og hver ende bidrar med 1 til
graden i sin node.

2. Trekjennetegnet: en urettet graf er et tre hvis og bare hvis den er
sammenhengende og E=V1|E| = |V| - 1.

Av det følger to snarveier du kan bruke direkte:

- Er grafen sammenhengende og E>V1|E| > |V| - 1, den ha minst én sykel.
- Er E<V1|E| < |V| - 1, kan grafen umulig være sammenhengende.

Med en sammenhengende graf der E=V|E| = |V| har du nøyaktig én sykel: du har
lagt én kant til et tre.

Advarsel om retningen. Kantregelen alene beviser ingenting. En graf med
V=6|V| = 6 og E=5|E| = 5 kan være et tre, men den kan like gjerne bestå av en
trekant og en løsrevet kjede — da har den både sykel og flere komponenter.
Du må sjekke sammenhengen også.

✏️Eksempel 2: Én kabel til — og treet blir en graf med sykel

Værstasjonsnettet fra eksempel 1 (kalt U5) får én ny radiolinje: mellom
E og F. Den nye grafen kaller vi U6.

Fyll ut avkryssingstabellen for begge: enkel graf? sammenhengende? har
sykel? er et tre? Begrunn hvert svar med tall der du kan.

U5 — nabolistene:

A: B, C
B: A, D, E
C: A, F
D: B
E: B
F: C

U6 — nabolistene, med kanten E-F lagt til under begge ender:

A: B, C
B: A, D, E
C: A, F
D: B
E: B, F
F: C, E

Regnestykkene først. U5 har V=6|V| = 6 og E=5|E| = 5; U6 har V=6|V| = 6 og
E=6|E| = 6. Gradsummene er 10 og 12, altså 2E2|E| i begge tilfeller.

EgenskapU5U6
Enkel graf?jaja
Sammenhengende?jaja
Har sykel?neija
Er et tre?janei
E|E| mot V1=5|V| - 1 = 55=55 = 56>56 > 5

Hvorfor U5 er et tre. Den er sammenhengende — fra A når du B og C, fra
B når du D og E, fra C når du F — og E=5=V1|E| = 5 = |V| - 1. Begge kravene er
oppfylt.
Hvorfor U6 ikke er det. Den er fortsatt sammenhengende og fortsatt
enkel, men nå er E=6>V1|E| = 6 > |V| - 1. Etter trekjennetegnet må den da ha
minst én sykel, og du kan peke på den: A -> B -> E -> F -> C -> A, en

sykel med fem kanter.
Legg merke til hva som IKKE endret seg. Grafen ble ikke mindre enkel og
ikke mindre sammenhengende. De fire spørsmålene i tabellen er uavhengige,

og en avkryssingsoppgave utnytter nettopp det: den gir deg grafer der bare
én av kolonnene skifter verdi.
Fellenote. Fella her er å kalle U6 et tre fordi «den ser ut som et tre
med en ekstra strek». Et tre har ingen sykler — én ekstra kant er nok

til å ødelegge det.

📝Oppgave 2
Sjanger F

Sju maskiner i et verksted er koblet i et internt nettverk:

A: B, C
B: A, C
C: A, B
D: E
E: D, F
F: E
G: (ingen)

a) Hvor mange kanter har grafen?
b) Er den sammenhengende? Begrunn.
c) Har den en sykel? Hvis ja, skriv den opp.
d) Er den et tre?

📝Oppgave 3
Sjanger F

Seks rundkjøringer i en bydel er forbundet med veier, alle
toveiskjørte:

A: B, D, E
B: A, C, F
C: B, D
D: A, C
E: A, F
F: B, E

a) Oppgi V|V|, E|E| og gradsummen, og kontrollér at de henger sammen.
b) Hvor mange kanter måtte grafen hatt for å være et tre, og hvor mange
har den?
c) Finn to ulike sykler i grafen.
d) Er grafen enkel?

Løkke 3 — naboliste eller nabomatrise (ca. 13 min)

Så langt har vi tegnet og fortalt. Nå skal grafen inn i en maskin, og da må
den lagres på en bestemt måte. Det finnes to måter du må kunne, og valget
mellom dem er et av de sikreste Del 1-punktene i hele faget.

Naboliste: for hver node lagrer du en liste over naboene dens. Det er
nøyaktig formen vi har brukt hele veien.

Nabomatrise: du lagrer en tabell med én rad og én kolonne per node, og
setter 1 i celle (u,v)(u, v) hvis kanten finnes, ellers 0.

De to inneholder den samme grafen. Forskjellen er hva som er billig.

Naboliste

Grafen lagret som én liste per node, med nodens naboer i.

Plass: O(V+E)O(|V| + |E|) — én listeoverskrift per node, pluss én oppføring
per kantende (i en urettet graf står hver kant to ganger, men 2E2|E| er
fortsatt O(E)O(|E|)).
Ramse opp naboene til v: O(grad(v))O(\text{grad}(v)) — du leser bare nodens
egen linje.
Spørre om kanten (u, v) finnes: O(grad(u))O(\text{grad}(u)) — du må lete
gjennom linja.

Dette er standardvalget i IN2010, og grunnen til at grafkjøretider skrives
O(V+E)O(|V| + |E|).

Nabomatrise

Grafen lagret som en tabell MM med V|V| rader og V|V| kolonner, der
M[u][v]=1M[u][v] = 1 hvis kanten finnes og 0 ellers. I en urettet graf er tabellen
speilsymmetrisk om diagonalen.

Plass: O(V2)O(|V|^2) — uansett hvor få kanter grafen har.
Spørre om kanten (u, v) finnes: O(1)O(1) — ett direkte oppslag.
Ramse opp naboene til v: O(V)O(|V|) — du må lese hele raden, også de
nullene som ikke er naboer.

Lønner seg når grafen er tett (nesten alle mulige kanter finnes) og
algoritmen stiller mange kantspørsmål.

📜Kostnadstabellen for de to representasjonene

Denne tabellen er ren puggeflate. Den er blitt spurt om i tabellform på
eksamen, og den skal kunne skrives ned uten oppslag.

OperasjonNabolisteNabomatrise
PlassO(V+E)O(|V| + |E|)O(V2)O(|V|^2)
Finnes kanten (u,v)(u, v)?O(grad(u))O(\text{grad}(u))O(1)O(1)
Ramse opp naboene til vvO(grad(v))O(\text{grad}(v))O(V)O(|V|)
Legg til en kantO(1)O(1)O(1)O(1)
Gå gjennom hele grafenO(V+E)O(|V| + |E|)O(V2)O(|V|^2)

Den siste linja er den viktigste, og den er lett å bomme på. Å gå gjennom
hele grafen fra nabolister koster O(V+E)O(|V| + |E|) — ikke O(E)O(|E|). Leddet
V|V| er der fordi du må innom hver node, også de som ikke har en eneste
nabo. Grafen U2 i oppgave 2 har en node uten kanter; den ville vært usynlig
i et rent kantregnskap. Dette leddet er kjernen i felle #6, som du møter
igjen for fullt i kap. 5.2.

Tommelfingerregelen: velg naboliste med mindre grafen er tett eller
algoritmen din i hovedsak stiller kantspørsmål. Med V=10000|V| = 10\,000 noder er
en nabomatrise 100 millioner celler, mens nabolistene tar plass i takt med
antall kanter som faktisk finnes.

✏️Eksempel 3: Samme graf, begge representasjoner, og hva de koster

Ni fuktsensorer i et veksthus står i et rutenett, og hver sensor har en
kabel til naboen rett ved siden av og rett over eller under. Grafen kaller
vi U8.

Skriv opp både naboliste og nabomatrise, regn ut hva hver representasjon
koster i plass, og avgjør hvilken du ville valgt.

Nabolistene:

A: B, D
B: A, C, E
C: B, F
D: A, E, G
E: B, D, F, H
F: C, E, I
G: D, H
H: E, G, I
I: F, H

Nabomatrisen:

       A   B   C   D   E   F   G   H   I
   A   0   1   0   1   0   0   0   0   0
   B   1   0   1   0   1   0   0   0   0
   C   0   1   0   0   0   1   0   0   0
   D   1   0   0   0   1   0   1   0   0
   E   0   1   0   1   0   1   0   1   0
   F   0   0   1   0   1   0   0   0   1
   G   0   0   0   1   0   0   0   1   0
   H   0   0   0   0   1   0   1   0   1
   I   0   0   0   0   0   1   0   1   0

Tallene. V=9|V| = 9 og E=12|E| = 12. Gradsummen er
2+3+2+3+4+3+2+3+2=24=2122+3+2+3+4+3+2+3+2 = 24 = 2 \cdot 12. Stemmer.

MålNabolisteNabomatrise
Lagrede tall24 naboangivelser + 9 listehoder92=819^2 = 81 celler
Andel som er «ingen kant»ingen8124=5781 - 24 = 57 nuller, altså 70 %
Finnes kanten (A,I)(A, I)?les A-linja: 2 navn, ikke derslå opp celle (A,I)(A, I): 0
Naboene til Eles E-linja: 4 navnles hele E-raden: 9 celler, finn 4 ettall

Valget: naboliste. Grafen er tynn — hver sensor har høyst fire
naboer uansett hvor stort veksthuset blir, mens matrisen vokser med
kvadratet av antall sensorer. Med 900 sensorer i stedet for 9 ville
matrisen hatt 810 000 celler, hvorav under 0,5 % ville vært ettall.
Når ville svaret vært motsatt? Hvis algoritmen din i hovedsak spør

«finnes akkurat denne kanten?» mange millioner ganger, og grafen er liten
eller tett. Da er O(1)O(1)-oppslaget verdt kvadratet.
Fellenote. Fella her er å blande de to kolonnene i kostnadstabellen —
å svare O(1)O(1) for kantoppslag i en naboliste, eller O(V+E)O(|V| + |E|)

for plassen til en nabomatrise. Lær tabellen som to par: matrisen er
«dyr plass, billig kantoppslag», lista er «billig plass, dyrt
kantoppslag».

📝Oppgave 4
Sjanger F

Verkstednettet U2 fra oppgave 2 har nabolistene

A: B, C
B: A, C
C: A, B
D: E
E: D, F
F: E
G: (ingen)

a) Skriv opp nabomatrisen.
b) Hvor mange celler har matrisen, og hvor mange av dem er ettall?
c) Hvor mange oppføringer har nabolistene til sammen?
d) Hvilken representasjon ville du valgt, og hvorfor?

📝Oppgave 5
Sjanger F

En sosial tjeneste lagrer vennskap mellom brukere som en urettet
graf. Det er 200 000 brukere, og hver bruker har i snitt 30 venner.

a) Omtrent hvor mange kanter har grafen?
b) Hvor mange celler ville en nabomatrise hatt?
c) Hvilken representasjon må velges, og hva mister du på valget?
d) Tjenesten skal svare på «er A og B venner?» og på «hvem er vennene til
A?». Hvilken av de to spørsmålene blir dyrere med valget ditt?

Løkke 4 — regelen som gjelder resten av boka (ca. 10 min)

— naturlig pausepunkt —

Nå kommer den ene setningen fra dette kapitlet som du skal skrive ned på
eksamen, i hver eneste Del 2-oppgave om grafer resten av livet ditt som
IN2010-student.

Når du blir bedt om å skrive en grafalgoritme, får du sjelden vite hvordan
grafen er lagret. Det er ikke en forglemmelse fra oppgavestillerens side — du
får velge selv. Men da må du si hva du valgte, for kjøretiden din henger
helt og holdent på det valget.

Skriver du «O(V+E)O(|V| + |E|)» uten å ha sagt at du antar nabolister, har du
oppgitt et tall sensor ikke kan kontrollere: med nabomatrise ville den samme
algoritmen vært O(V2)O(|V|^2).

Antagelsesregelen — kandidaten oppgir representasjonen

I en Del 2-besvarelse skriver du hvilken representasjon du antar, og
hvilke felter en node har. En typisk formulering er: «Grafen er gitt som
nabolister; hver node v har feltet v.naboer

Sensor binder seg ikke til én representasjon — nabolister, nabomatrise og
objektstil godtas alle. Men uten antagelsen kan ikke kjøretiden din
kontrolleres mot algoritmen, og det trekkes. Regelen koster deg én linje og
er blant de billigste poengene i hele Del 2.

✏️Eksempel 4: Avkryssingstabellen, slik den kommer på Del 1

Fire grafer er gitt ved nabolistene sine. Kryss av for hver: er den enkel?
er den sammenhengende? har den en sykel? er den et tre?

U1:  A: B, C | B: A, D | C: A, D, E | D: B, C, F | E: C, F | F: D, E, G | G: F, H | H: G
U5:  A: B, C | B: A, D, E | C: A, F | D: B | E: B | F: C
U6:  A: B, C | B: A, D, E | C: A, F | D: B | E: B, F | F: C, E
U9:  A: B, D, E | B: A, C, F | C: B, D | D: A, C | E: A, F | F: B, E

Framgangsmåten som gjør dette til fem regnestykker i stedet for fire
tegninger:

1. Tell V|V| (antall linjer) og E|E| (gradsummen delt på 2).
2. Sammenlign E|E| med V1|V| - 1.
3. Sjekk sammenhengen ved å følge naboene fra første node.
4. «Enkel?» leses direkte: står noen node som sin egen nabo, eller står et
navn to ganger på samme linje?

GrafV|V|E|E|V1|V| - 1Enkel?Sammenhengende?Har sykel?Er et tre?
U1897jajajanei
U5655jajaneija
U6665jajajanei
U9675jajajanei

Begrunnelsene, én linje hver:
- U1: E=9>7=V1|E| = 9 > 7 = |V| - 1, og grafen er sammenhengende, så den må
ha sykel. En av dem er A -> B -> D -> C -> A.
- U5: E=5=V1|E| = 5 = |V| - 1 og sammenhengende. Begge trekravene er
oppfylt — dette er det eneste treet i settet.

- U6: akkurat U5 med kanten E-F i tillegg. Én kant over

tregrensen betyr nøyaktig én sykel: A -> B -> E -> F -> C -> A.
- U9: E=7|E| = 7, altså to over tregrensen, og grafen henger sammen —
minst to sykler, blant andre A -> B -> C -> D -> A.
Legg merke til hvordan tabellen er bygget. Alle fire grafene er enkle
og sammenhengende; det er bare de to siste kolonnene som skiller dem. En
avkryssingsoppgave er laget nettopp slik, og den belønner den som regner
E|E| mot V1|V| - 1 framfor den som ser på tegningen og gjetter.
Fellenote. Fella her er felle #10 i bokas feilregister — å svare

uten å ha definert hva størrelsene er. Skriv opp V|V| og E|E| for hver
graf før du krysser av, så blir tre av de fire kolonnene mekaniske.

📝Oppgave 6
Sjanger F, eksamensnivå

Fyll ut den samme avkryssingstabellen for disse to
grafene:

U2:  A: B, C | B: A, C | C: A, B | D: E | E: D, F | F: E | G: (ingen)
U8:  A: B, D | B: A, C, E | C: B, F | D: A, E, G | E: B, D, F, H | F: C, E, I | G: D, H | H: E, G, I | I: F, H

For hver graf: V|V|, E|E|, enkel?, sammenhengende?, har sykel?, er et tre?
Begrunn kolonnene «har sykel» og «er et tre» med tall.

📝Oppgave 7
Eksamensnivå, sjanger F…

Et logistikkselskap modellerer
veinettet mellom 50 000 terminaler. Hver terminal har direkte vei til høyst
seks andre. To ulike programmer skal skrives:

Program 1 spør, milliarder av ganger, «finnes det direkte vei mellom terminal
uu og terminal vv?». Program 2 går gjennom hele nettet én gang og gjør noe
med hver vei.

a) Anslå E|E|.
b) Hva koster de to programmene med naboliste, og hva koster de med
nabomatrise?
c) Hva ville du valgt, og hvordan ville du formulert antagelsen i en
besvarelse?
d) Finnes det en løsning som gir begge programmene det de vil ha?

📝Oppgave 8
Eksamensnivå, sjanger F

Avgjør om hver påstand er sann eller usann, og
begrunn med ett regnestykke eller ett moteksempel. Svarene skal ikke være
like — les hver påstand for seg.

a) En sammenhengende urettet graf med V=20|V| = 20 og E=19|E| = 19 er et tre.
b) En urettet graf med V=20|V| = 20 og E=19|E| = 19 er et tre.
c) En enkel urettet graf med V=6|V| = 6 kan ha 16 kanter.
d) I en urettet graf kan gradsummen være 15.
e) Å gå gjennom hele en graf lagret som nabolister koster O(E)O(|E|).

Begrepsbank

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

Håndtrykkslemmaet — gradsummen

I en urettet graf er vVgrad(v)=2E\sum_{v \in V} \text{grad}(v) = 2|E|.

Navnet kommer av at antall håndtrykk i et rom alltid telles dobbelt hvis du
spør hver person hvor mange hender de tok. Konsekvensene du bruker på
eksamen: gradsummen er alltid et partall, og E|E| finnes ved å dele den på
2. I en rettet graf gjelder i stedet
inngrad(v)=utgrad(v)=E\sum \text{inngrad}(v) = \sum \text{utgrad}(v) = |E|.

Maksimalt antall kanter i en enkel graf
EV(V1)2\displaystyle |E| \le \frac{|V| \cdot (|V| - 1)}{2} i en enkel urettet graf, fordi hvert
nodepar kan ha høyst én kant.

For V=6|V| = 6 gir det 15 kanter; for V=10|V| = 10 gir det 45. En graf som
nærmer seg denne grensen kalles tett, og da — og først da — kan
nabomatrisen forsvares på plass. I en rettet enkel graf er grensen det
dobbelte, V(V1)|V| \cdot (|V| - 1).

Tett og tynn graf

En graf er tett når E|E| er i nærheten av V2|V|^2, og tynn når E|E|
er nærmere V|V|.

Nesten alle grafer i praksis er tynne: veinett, vennelister, lenkegrafer og
avhengighetsgrafer har alle en grad som er begrenset uansett hvor store de
blir. Det er hovedgrunnen til at naboliste er standardvalget, og til at
O(V+E)O(|V| + |E|) er den kjøretiden du sikter mot.

Kantoppslag — finnes kanten (u, v)?

Spørsmålet «går det en kant mellom disse to nodene?».

Nabomatrise: O(1)O(1) — ett direkte oppslag i celle (u,v)(u, v).
Naboliste: O(grad(u))O(\text{grad}(u)) — du må lete gjennom u-linja.

Dette er den ene operasjonen matrisen vinner klart på, og derfor det ene
argumentet for å velge den.

Naboiterasjon — hvem er naboene til v?

Å ramse opp alle nodene som deler en kant med v. Dette er den operasjonen
alle grafalgoritmer i faget bruker mest.

Naboliste: O(grad(v))O(\text{grad}(v)) — du leser bare nodens egen linje.
Nabomatrise: O(V)O(|V|) — du må lese hele raden, også alle nullene.

Summert over alle noder blir det O(V+E)O(|V| + |E|) for nabolisten og O(V2)O(|V|^2)
for matrisen. Det er nøyaktig derfor kjøretidene i resten av Del 5 skrives
O(V+E)O(|V| + |E|), og hvorfor de blir O(V2)O(|V|^2) hvis du antar nabomatrise.

Repetisjon — kapitlet på ett kort

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 Universitetet i Oslo. Dette er ikke offisielt studiemateriell. Les mer.