Aloritmr oh tstrukturr, förläsnin Dnn förläsnin hnlr rfr. En rf hr n män nor (vrtx) oh n män år (). Ett xmpl är: A E F B D G H C Z Dnn rf hr följn män v nor: {A, B, C, D, E, F, G, H, Z Dn hr följn män år: {<A, B>, <B, C>, <C, D>, <C, D>, <D, E>, <E, F>, <G, H>, <H, Z> Osrvr tt årn är rikt! Vi finirr n nos utr som ntl år som år ut från non. En nos inr är ntlt år in till non. En vä från no A till no B är n män nor vi vilk mn kn å från A till B vi år. Osrvr tt mn får r å i pilns riktnin på n å. En ykl är n vä är först oh sist non är smm. En nkl ykl är n ykl är ll nor utom n sist oh n först är olik. I n orikt rf finns t inn riktnin på årn, mn får å åt å hålln. Mn kn s n orikt rf som n rikt rf är t llti finns n å från B till A om t okså finns n från A till B. En rf klls smmnhänn om t finns n vä mlln ll nor. Grfn i fiurn ovn är lltså int smmnhänn. Dn hr två komponntr. Oft finns t nåot vär på årn i n rf. Dt kn till xmpl rprsntr länn v vän mlln två nor llr kostnn för tt å mlln två nor.
Rprsnttion v rfr Dn nklst rprsnttionn är tt nvän n mtris. Ant till xmpl tt vi hr följn rf: 4 5 A B 4 C D 3 Dn kn rprsntrs v följn mtris llr tll: A B C D A null 4 null null B 5 null 4 C 3 null null null D null null null En nkl är tt om rfn är stor så lir mtrisn mykt stor. Oft så finns t r år mlln nor som lir när vrnr oh å kommr t oftst tt stå null i tlln. En nnn rprsnttion är närhtslistn. Dn sr ut så här för rfn ovn: A B C D 4 5 4 3 Fyrkntrn länst till vänstr rprsntrr norn. I fyrkntrn finns t som hör hop m non. D mr vlån fyrkntrn rprsntrr årn, här finns okså t som hör ihop m ån. D år som rs upp till vänstr om n no är år som utår från non. Piln som år från vrj å till n no visr till vilkn no som ån år. Rprsnttion i Jv I Jv nvänr mn vnlitvis tr olik klssr för tt rprsntr rfr. In är smm som för trä oh länk listor, tt mn hr n klss för trät llr listn oh n för norn som i sin tur kn innhållr t. Vi nvänr n noklss, n åklss oh n rfklss. En skiss v m följr nn.
Vi örjr m noklssn. Dn kn s ut så här: puli lss Vrtx{ //Noklssn puli Vrtx nxtvrtx(){ puli E firste(){ Om till xmpl no A i rfn ovn nropr nxtvrtx så får mn B t. Om D nropr nxtvrtx() så lir rsulttt null ftrsom t int finns nåon näst no. Om no A nropr firste() så får mn ån som är strx till vänstr om n. Båklssn kn h föjn prinipill utsn: puli lss E{ puli E nxte(){ puli Vrtx npoint(){ Om mn nropr nxte() så får mn n å som finns till hör i närhtslistn. Om t int finns nåon så får mn null. Om mn nropr npoint() så får mn r på vilkn no som ån pkr på. Själv rfklssn kn s ut så här: puli lss DiGrph{ puli Vrtx firstvrtx(){ puli voi insrtvrtx(vrtx v){ puli voi insrte(vrtx v, Vrtx w, E ){ Om mn nropr firstvrtx() så får mn n först non i rfn, i närhtsrfn ovn är t no A. Exmpl Ant tt vi vill å inom ll nor i n rf oron v år. Då kn mn ör så här: Vrtx v =.firstvrtx(); whil (!= null){ //Gör nåot m non här v = v.nxte(); Osrvr tt mn int lls följr årn i rfn när mn ör så här. Exmpl Ant tt vi vill sök ll rnnrn till non v. Så här kn mn ör å: E = v.firste(); whil (!= null){ Vrtx w =.npoint(); //Bhnl non
=.nxte(); Att å inom rfr Vi sk titt på två sätt tt å inom (trvrsr) rfr nom tt följ årn. I ä flln hövs t n strtno. Dn kn mton firstvrtx() i rfklssn förs oss m. Dn n mton klls jupt först oh n nr rn först. Djupt först Mn nvänr rkursion för tt å inom norn. Mn mkrr nor som sökt när mn hr sökt m, vrj no hr tt oolskt ttriut visit som nväns för tt. Mn kn nst komm till nor som kn nås från strtnon. Dt tyr tt om rfn hr flr komponntr så kommr mn r tt sök ll nor i strtnons komponnt. Mton för tt plrs lämplin i rfklssn. Kon kn s ut så här: puli voi pthfirst(vrtx v){ v.visit = tru; // Gör nåot m non E = v.firste(); whil (!= null){ Vrtx w =.npoint(); if (!w.visit) pthfirst(w); =.nxte(); Brn först Här sökr mn först ll strtnons rnnr, sn rnnrns rnnr t. Okså här nväns tt oolskt ttriut för tt mrkr tt n no är sökt. Kon kn s ut så här: puli voi rthfirst(vrtx v){ v.visit = tru; //Gör nåot m non q.(v); whil (!q.isempty()){ Vrtx x = q.rmov; E = x.firste(); whil (!= null){ Vrtx w = npoint(); if (!w.visit){ w.visit = tru; //Gör nåot m non; q.(w); =.nxte(); q kn vr t x n list i vilkn mn lrr nor vrs rnnr mn sk sök. Mn sökr r nor som kn nås från strtnon.
Aloritmr för tt hitt kortst vä från n strtno till ll nr nor i n rf Vi sk titt på tr fll:. All år hr länn. All år hr positiv län, mn kn vr olik 3. Bårn kn h å positiv oh ntiv län All år hr länn Dtt är t nklst fllt är mn okså kn hitt n ffktivst loritmn. Aloritmr sökr si frm nom rfn oh n no i vilkn mn just är klls ktull no. Låt oss nvän följn rf som tt xmpl: f Ant tt strtnon är. Vi örjr m tt sätt ktull no till. Avstånt till är 0 för självt oh oänlihtn för nr norn när loritmn örjr. Vi år inom rfn m rn först ( v s först sökr mn rnnr, sn rnnrns rnnr oh så vir) oh räknr sussivt ättr (kortr) värn för vstånt. Mn kn smmnftt loritmn i rfn i n tll som sr ut så här: Aktull no f inf inf Avstån 0 inf oh inf vä inf inf Nor tt f sök inf 0 inf inf inf f inf 0 inf inf inf 0 inf inf 3 3 0 Dn först rn innhållr loritmns strtvärn. I näst r tr vi non oh kollr på :s rnnr, t vill sä oh f. Bä ss hr prliminärt vstån inf till oh vi kn hitt tt ättr vstån nämlin. Vi skrivr vstånt i tlln oh nr unr :orn från vilkn
no mn kommr. Eftrsom oh f vr rnnr som vi sökt skrivr vi in m i listn övr nor tt sök. Därftr tr vi f från n listn oh ör f till ktull no. Mn från f lr in år till nåon nnn no, så t lr int till nåon föränrin v vstånn. I näst r så är ktull no oh å hittr vi ättr vstån till oh. Aloritmr fortsättr tills ll vstån är stäm. All vstån är positiv mn kn vr olik lån Dtt fll hnls ffktivt v Dijkstrs loritm som pulirs 959 (mn upptäkts rn 956). Aloritmn kn skrivs så här:. G ll nor tt vstån, 0 för strtnon, oänlihtn för ll nr.. Mrkr ll nor som osökt oh sätt ktull no = strtnon. 3. För ktull no: Bräkn tt prliminärt vstånt från strtnon till ll rnnr om mn år vi n ktull non. Om tt vstån är minr än t vstån som rnnn rn hr så rsätt t ml m t prliminär. 4. När ll rnnr är sökt, mrkr ktull no som sökt. 5. Om ll nor är sökt så är vi färi. Om j sätt n osökt non m minst vstån till ktull no oh å tillk till punkt 3. Vi kn t tt xmpl, nt tt vi hr följn rf: 4 3 8 4 5 f 6 0 Vi ör n tll för tt smmnftt loritmn (strtno är ): Aktull no Avstån oh vä f 0 inf inf inf inf inf inf inf inf inf inf 3 3 9 5 3 3 9 5 3 8 5 8 5 6
Dn först rn är utånslät. I näst r upptrr vi vstånn för :s rnnr. No lir sn ktull no för n hr kortst vstån till. Därftr kollr vi om vi kn hitt kortr vstån om vi år irktvän vi t. Mn kn nvän n priorittskö för tt hitt n no v hittills j sökt som hr kortst vä till strtnon. Bålänr får vr å positiv oh ntiv I tt fll kn mn nvän Bllmn-Fors loritm. Dn rtr nom tt sussivt hitt ättr oh ättr vär. En svåriht är tt om t finns yklr är summn v länrn är ntiv så finns t int nåon lösnin. Bllmn-Fors loritm upptäkr ävn tt fll. Låt oss nt tt vi hr följn rf är är strtno: 6 8 5 - -3-4 9 Vi nvänr n tll. Aktull no Avstån Nor tt hnl 0 inf inf inf inf 0 6 inf inf 0 6 4 6 0 6 4 0 6 4 0 4 0 4-0 4 - På vrj r kollr vi om t år tt hitt n kortr vä nom tt å från n ktull non till nåon v n ktull nons rnnr. Vrj ån som t lir n föränrin v tt vstån så stoppr vi in n no vrs vstån föränrs i Nor tt hnl om int non rn finns är. Om t finns ntiv yklr så kommr loritmn int tt konvrr.