Föreläsning 11 Riktade grafer. Viktade grafer. T70/1: ALG Utskriftsversion av föreläsning i atastrukturer och algoritmer 14 oktober 2013 Tommy Färnqvist, IA, Linköpings universitet 11.1 Innehåll Innehåll 1 Riktade grafer 1 2 Konnektivitet 3 Transitivt hölje 6 4 Topologisk sortering 11 Viktade grafer 17 6 Kortaste vägar 1 11.2 1 Riktade grafer Introduktion I en riktad graf är alla bågar riktade A 11.3 genskaper n graf G = (V,) sådan att varje båge går i en riktning: åge (a,b) går från a till b men inte från b till a. Om G är enkel (inga parallella bågar och inga öglor) gäller m n (n 1), d.v.s. m O(n 2 ). 1
A 11.4 Politisk bloggosfär-graf The Political logosphere and the 2004 US lection: ivided They log, Adamic och Glance, 200 11. Nattliga lån mellan banker The Topology of the Federal Funds Market, ech och Atalay, 200 11.6 Implikationsgraf 2
11.7 Kombinatorisk krets 11. WordNet-graf 11. 3
http://www.guardian.co.uk/news/datablog/2010/apr/2/mcchrystal-afghanistan-powerpoint-slide 11.10 Tillämpningar riktad graf transport www näringskedja schemaläggning finansiell mobiltelefon smittsam sjukdom citeringar objektgraf arvshierarki kontrollflöde nod gatukorsning hemsida art uppgift bank person person artikel objekt klass kodblock rikatd båge enkelriktad gata hyperlänk rovdjur-byte-förhållande föregångarvillkor transaktion ringt samtal infektion citering pekare ärver från hopp 11.11 Några algoritmiska grafproblem Stig. Finns det en riktad stig från s till t? Kortaste väg. Vilken är den kortaste riktade stigen från s till t? Stark konnektivitet. Finns det en riktad stig mellan alla par av noder? Topologisk sorting. Går det att rita den riktade grafen så att alla kanter pekar uppåt? Transitivt hölje. För vilka noder v och w finns det en stig från v till w? Page Rank. Hur betydelsefull är en webbsida? 11.12 Riktad FS Vi kan specialisera traverseringsalgoritmerna (FS och FS) till riktade grafer I den riktade FS-algoritmen får vi fyra typer av bågar discovery -bågar bakåt-bågar framåt-bågar korsande bågar n riktad FS med start i nod s bestämmer vilka noder som är nåbara från s 4
A 11.13 2 Konnektivitet Nåbarhet FS-träd rotat i v: noder nåbara från v via riktade stigar F A A F A 11.14 Starkt sammanhängande Varje nod är nåbar från alla andra noder a c g d e f b 11.1 Algoritm för att avgöra starkt sammanhängande Välj en nod v i G // Kan alla noder nås från v?utför FS från v i G Om det finns w som inte besöks svara nej Låt G vara G med riktningen på varje båge omkastad // Kan v nås från alla noder?utför FS från v i G Om det finns w som inte besöks svara nej Annars, svara ja
Körtid: O(n + m) G: a c g d e f b G : a c g d e f b 11.16 Starkt sammanhängande komponenter Maximal delgraf sådan att varje nod kan nå alla andra noder i delgrafen Kan också göras i O(n + m) tid genom att använda FS i flera steg a c g { a, c, g } f d e b { f, d, e, b } 11.17 3 Transitivt hölje Transitivt hölje Givet en riktad graf G, låt det transitiva höljet av G vara den riktade grafen G sådan att G har samma noder som G om G har en riktad stig från u till v (u v) så har G en riktad båge från u till v et transitiva höljet ger information om nåbarheten i en riktad graf A G A G* 11.1 eräkning av transitiva höljet Vi kan köra FS med start i varje nod v 1,...,v n, alltså O(n (n + m)) Alternativt använda dynamisk programmering: Floyd-Warshalls algoritm 11.1 6
Transitiva höljet med Floyd-Warshall Numrera noderna 1,2,...,n. I fas k, betrakta bara stigar som använder noder med nummer 1,2,...,k som mellanliggande noder: i Använder bara noder numrerade 1,,k (lägg till bågen om den inte redan är med) Stig med noder numrerade 1,,k-1 k Stig med noder numrerade 1,,k-1 j 11.20 Floyd-Warshalls algoritm Floyd-Warshalls algoritm numrerar noderna i G som v 1,...,v n och beräknar en serie riktade grafer G 0,...,G n G 0 = G G k har en riktad båge (v i,v j ) om G har en riktad stig från v i till v j med mellanliggande noder i mängden {v 1,...,v k } Vi ser att G n = G I fas k beräknas grafen G k utgående från G k 1 Körtid: O(n 3 ) om areadjacent är O(1) 11.21 Floyd-Warshalls algoritm function FLOYWARSHALL(G) G 0 G for k 1 to n do G k G k 1 for i 1 to n (i k) do for j 1 to n ( j i,k) do if G k 1.ARAJANT(v i,v k ) then if G k 1.ARAJANT(v k,v j ) then if G k.arajant(v i,v j ) then G k.insrtirtg(v i,v j,k) return G n 11.22 xempel: Floyd-Warshall OS v 7 OR v 4 v 2 SFO JFK v 6 LAX v 1 v 3 FW MIA v 7
11.23 Floyd-Warshall, iteration 1 OS v 7 OR v 4 v 2 SFO JFK v 6 LAX v 1 v 3 FW MIA v 11.24 Floyd-Warshall, iteration 2 OS v 7 OR v 4 v 2 SFO JFK v 6 LAX v 1 v 3 FW MIA v 11.2 Floyd-Warshall, iteration 3
OS v 7 OR v 4 v 2 SFO JFK v 6 LAX v 1 v 3 FW MIA v 11.26 Floyd-Warshall, iteration 4 OS v 7 OR v 4 v 2 SFO JFK v 6 LAX v 1 v 3 FW MIA v 11.27 Floyd-Warshall, iteration
OS v 7 OR v 4 v 2 SFO JFK v 6 LAX v 1 v 3 FW MIA v 11.2 Floyd-Warshall, iteration 6 OS v 7 OR v 4 v 2 SFO JFK v 6 LAX v 1 v 3 FW MIA v 11.2 Floyd-Warshall, slutet 10
OS v 7 OR v 4 v 2 SFO JFK v 6 LAX v 1 v 3 FW MIA v 11.30 4 Topologisk sortering Riktade acykliska grafer och topologisk ordning n riktad acyklisk graf (AG) är en riktad graf som inte har några riktade cykler n topologisk ordning av en graf är en totalordning v 1,...,v n av noderna sådan att varje båge (v i,v j ) uppfyller i < j xempel: I en riktad graf som svarar mot en instans av uppgiftsschemaläggning är en topologisk ordning en sekvens av uppgifter som uppfyller kraven på inbördes ordning mellan uppgifterna Proposition 1 (13.21 i kursboken). n riktad graf går att ordna topologiskt omm grafen är en AG A AG G v 2 v 1 A v 4 v v3 Topologisk ordning av G 11.31 Topologisk sortering Numrera noderna, så att (u,v) u < v 11
1 vakna 2 3 äta plugga ALG 7 spela baka kakor till läraren 4 sova mer ALG skriva datorprogram 10 sova n typisk studentdag 6 träna 11 drömma om grafer 11.32 Algoritm för topologisk sortering procedure TOPOLOGIALSORT(G) S ny tom stack for all u G.VRTIS() do låt INOUNTR(u) vara ingraden för u if INOUNTR(u) = 0 then S.PUSH(u) i 1 while S.ISMPTY() do u S.POP() låt u få nummer i i den topologiska ordningen i i + 1 for all utgående kanter (u,w) från u do INOUNTR(w) INOUNTR(w) 1 if INOUNTR(w) = 0 then S.PUSH(w) Körtid: O(n + m). 11.33 Alternativ algoritm för topologisk sortering procedure TOPOLOGIALSORT(G) H G n G.NUMVRTIS while H är icke-tom do låt v vara en nod utan utgående bågar märk v med n n n 1 ta bort v från H temporär kopia av G Körtid: O(n + m). Hur då...? 11.34 Algoritm för topologisk sortering via FS Simulera algoritmen genom att använda en djupetförstsökning procedure TOPOLOGIALFS(G) n G.NUMVRTIS sätt alla noder och bågar till UNXPLOR som i FS for all v G.VRTIS() do if GTLAL(v) = UNXPLOR then TOPOLOGIALFS(G, v) procedure TOPOLOGIALFS(G, v) STLAL(v,V ISIT ) for all e G.ININTGS(v) do if GTLAL(e) = UNXPLOR then w OPPOSIT(v, e) 12
if GTLAL(w) = UNXPLOR then STLAL(e, ISOV RY ) TOPOLOGIALFS(G, w) else e är korsande båge eller framåt-båge märk v med topologiskt nummer n n n 1 11.3 xempel: Topologisk sortering 11.36 xempel: Topologisk sortering 11.37 xempel: Topologisk sortering 13
11.3 xempel: Topologisk sortering 7 11.3 xempel: Topologisk sortering 14
6 7 11.40 xempel: Topologisk sortering 6 7 11.41 xempel: Topologisk sortering 1
6 4 7 11.42 xempel: Topologisk sortering 3 6 4 7 11.43 xempel: Topologisk sortering 16
2 3 6 4 7 11.44 xempel: Topologisk sortering 2 1 3 6 4 7 11.4 Viktade grafer Viktade grafer I en viktad graf är varje båge associerad med ett numeriskt värde kallat bågens vikt. ågvikter kan representera avstånd, kostnader, etc. 11.46 Google maps 17
11.47 olaget ontinentals flygrutter i USA (augusti 2010) 11.4 Tillämpningar PRT/PM Kartapplikationer Seam carving Robotnavigering Texture mapping Typsättning i TeX Trafikplanering i stadsmiljö Optimal pipelining för VLSI-chip Schemaläggning av telemarketingförsäljare Routing av meddelanden inom telekom. Routingprotokoll för nätverk (OSPF, GP, RIP) Utnyttja gynsamma situationer vid valutahandel Optimal ruttplanering för lastbilar givet trafikstockningsmönster 1
ng. endpoints, incident, adjacent, degree, parallel, loops 6 11.4 Kortaste vägar Problemet kortaste väg Givet en viktad graf och två noder u och v vill vi hitta en stig mellan u och v med minimal total vikt. Längden av en stig är summan av vikterna på stigens bågar xempel Kortaste vägen mellan Providence och Honolulu PV OR SFO LGA HNL LAX FW MIA 11.0 genskaper hos kortaste vägar n delväg av en kortaste väg är också en kortaste väg et finns ett träd av kortaste vägar från en startnod till alla andra noder xempel tt träd av kortaste vägar från Providence PV OR SFO LGA HNL LAX FW MIA 11.1 1
ijkstras algoritm Avståndet från en nod v till en nod s är längden av kortaste vägen mellan s och v ijkstras algoritm beräknar avstånden från en given startnod s till alla noder v i grafen Antaganden: grafen är sammanhängande bågarna är oriktade grafen har inga öglor eller parallella bågar bågvikterna är ickenegativa Vi bygger ett moln av noder med start i s, som till slut täcker alla noder Vi märker varje nod v med d(v), vilket betecknar avståndet mellan v och s i delgrafen bestående av molnet och noderna som är grannar till molnet I varje steg lägger vi till den nod u utanför molnet som har minst avståndsmärkning d(u) uppdaterar vi märkningen av noderna som är grannar till u 11.2 Utökningssteget etrakta en båge e = (u,z) sådan att u är noden vi nyligen lagt till i molnet z inte är med i molnet Relaxeringen av bågen e uppdaterar d(z) enligt: d(z) min{d(z), d(u) + weight(e)} s d(u) 0 u e d(z) 7 z s d(u) 0 u e d(z) 60 z 11.3 xempel 0 A 4 2 7 2 1 4 3 2 F 0 A 4 2 7 2 1 3 3 2 F 0 A 4 2 7 2 1 3 3 11 2 F 0 A 4 2 7 7 2 1 3 3 2 F 11.4 20
Fortsättning på exemplet 0 A 4 2 7 7 2 1 3 3 2 F 0 A 4 2 7 7 2 1 3 3 2 F 11. ijkstras algoritm n prio-kö lagrar noderna utanför molnet Nyckel: avstånd Värde: nod Lokator-baserade metoder insert(k,v) returnerar en lokator replacekey(l,k) ändrar en posts nyckelvärde Vi lagrar två saker i varje nod: avstånd (d(v)) lokator i prio-kön procedure IJKSTRA(G, s) Q ny tom heapbaserad prio-kö for all v G.VRTIS() do if v = s then STISTAN(v, 0) else STISTAN(v, ) l Q.INSRT(GTISTAN(v), v) STLOATOR(v, l) while Q.ISMPTY() do u Q.RMOVMIN() for all e G.ININTGS(u) do z G.OPPOSIT(u, e) r GTISTAN(u)+WIGHT(e) if r <GTISTAN(z) then STISTAN(z, r) Q.RPLAKY(GTLOATOR(z), r) 11.6 Analys av ijkstras algoritm Grafoperationer Vi anropar incidentdges en gång för varje nod Märkningsoperationer Vi hämtar/sätter avstånd och lokator för nod z O(deg(z)) gånger Att sätta/hämta en märkning tar tid O(1) Prio-köoperationer 21
Varje nod sätts in en gång och tas ut en gång från prio-kön, där varje insättning och borttagning tar tid O(logn) n nods nyckel i prio-kön ändras som mest deg(w) gånger, där varje nyckeländring tar tid O(logn) ijkstras algoritm har exekveringstid O((n+m) logn) givet att grafen representeras med en grannlista Kom ihåg att v deg(v) = 2m xekveringstiden kan också uttryckas som O(mlogn) eftersom vi antagit att grafen är sammanhängande 11.7 Varför ijkstras algoritm fungerar ijkstras algoritm är baserad på den giriga metoden. Algoritmen lägger till noderna efter ökande avstånd. Antag att algoritmen inte hittade alla kortaste avstånd. Låt F vara den första felaktiga noden som behandlas. När den föregående noden,, längs den sanna kortaste vägen behandlades var dess avstånd korrekt. Men bågen (,F) relaxerades i det steget! Mao, så länge d(f) d() kan inte avståndet till F bli fel. vs, ingen nod får fel avstånd. 7 0 A 2 7 2 1 3 2 F 4 3 11. Varför ijkstras algoritm inte fungerar med negativa bågvikter ijkstras algoritm är baserad på den giriga metoden. Algoritmen lägger till noderna efter ökande avstånd. Om en nod med en negativ incident båge skulle läggas till sent i molnet skulle den förstöra avståndet till noder som redan finns i molnet. 0 A 4 6 7 7 1 4 0-2 F s sanna avstånd är 1, men finns redan i molnet med d()=! 11. ellman-fords algoritm (finns inte i kursboken) Fungerar även med negativa bågvikter Måste anta riktade bågar (annars kan det finnas cykler med negativ vikt) Iteration i hittar alla kortaste vägar som använder i bågar xekveringstid: O(nm) Kan utökas till att detektera cykler med negativ vikt procedure LLMANFOR(G, s) for v G.VRTIS() do if v = s then STISTAN(v, 0) else STISTAN(v, ) for i 1 to n 1 do for each e G.GS() do u G.ORIGIN(e) z G.OPPOSIT(u, e) r GTISTAN(u)+WIGHT(e) if r <GTISTAN(z) then STISTAN(z, r) 11.60 22
xempel Noderna är märkta med resp d(v)-värde 0-2 7 1 4 0 4-2 7-2 1 4 3-2 3-2 0-2 7 1-2 1 3-2 6 4 4-1 0 4-2 7 1-2 -1 3-2 4 1 11.61 23