729G04 - Diskret matematik. Lektion 4 Ett generellt råd är att rita upp noder och bågar för graferna nedan. 1 Uppgifter 1.1 Vägar, stigar och annat 1. Vi ges den oriktade grafen G=(V,E), V = {a, b, c, d, f, g, h, i, j}, E = {{a, b}, {b, c}, {a, c}, {f, g}, {c, d}, {b, d}, {d, i}, {j, i}}. a) Beskriv en promenad i grafen. b) Beskriv en väg i grafen. Finns det en väg som inte är en stig? Beskriv den isåfall. c) Beskriv en stig i grafen. Finns det en stig som inte är en väg? Beskriv den isåfall. d) Är grafen cykelfri? 1.2 Sammanhängandebegreppet, komponenter 2. Konstruera en delgraf G G (G från uppgiften ovan) som är en skog (en samling träd). 3. Betrakta grafen från uppgift 1 ovan. a) Vilka är komponenterna i grafen? b) Är G = (V, E ), V = {a, b, c}, E = {{a, b}, {b, c}, {c, a}} en komponent i grafen? Bevis eller motexempel. 4. Vi ges den riktade grafen G=(V,E), V={a, b, c, d, f, g, h}, E = {(a, f), (f, a), (a, b), (b, c), (c, g), (c, d), (d, b)}. Vilka är komponenterna i grafen? Här avses maximal strongly connected components (MSCC). 1
5. Den riktade grafen ovan är inte acyklisk. a) Bekräfta det. b) Antag att du kan ta bort- eller vända på bågar. Vilket är det minsta antal bågar som behöver tas bort/vändas för att grafen ska bli acyklisk? 6. Vi ges en (oriktad) graf över ett nätverk med skådespelare. Det finns en båge mellan två skådespelare om de varit med i samma film. Grafen är inte sammanhängande. Berätta något som vi kan säga om personerna, och deras kopplingar. 2
1.3 Billigaste vägar (med mera) Pseudokod för Dijkstras algoritm finns i appendix. 7. Vi ges den riktade, viktade grafen G=(V,E) med V={a, b, c, d, f, g, h, i}, viktade kanter E som nedan. Båge Vikt (a, b) 0 (a, c) 5 (b, d) 1 (b, h) 2 (h, d) 2 (c, f) 5 (d, c) 2 (d, g) 8 (f, g) 0 (f, d) 0 (g, f) 1 (g, i) 3 (f, i) 4 a) Hitta den billigaste vägen från a till i (om den finns). Vilken blir kostnaden? Vilken är vägen? b) Hitta den billigaste vägen från g till b (om den finns). Vilken blir kostnaden? Vilken är vägen? c) Du vill nu hitta alla noder som är nåbara från f (noder v sådana att det finns en väg f... v i grafen). Det kan man göra enkelt här, men vi söker helst en mer generell algoritm. Modifiera Dijkstras algoritm så att du kan hitta alla noder, och hitta sedan alla noder som är nåbara från f. 8. När vi ser på strukturen för ett nätverk kan det vara intressant att se på dess diameter sett utifrån en viss nod v. I en vänskapsgraf innebär det att vi bildar kedjor av vänner till v, vänner-till-vänner-till-v och så vidare. Diametern sett från v är längden av den allra längsta sådana vänskapskedjan. Använd (en lätt modifierad) Dijkstras algoritm för att räkna ut diametern i grafen från uppgift 1, sett från nod j 1. 1 Jfr här Six degrees of Kevin Bacon 3
1.4 Blandat 9. Vi ges grafen från avsnitt 7 ovan. Vilka komponenter har den? Beskriv de respektive delgraferna. 10. I grafen från 7 kan vi ta hitta en väg a i. Hur många bågar behöver vi ta bort för att det inte ska finnas en sådan väg? Om vi försöker ta bort bågar så att a i, samtidigt som w(e) e är en borttagen båge minimeras, vilka ska vi ta bort då? 2 11. Begreppsövning: En riktad graf G med mer än en nod är starkt sammanhängande (grafen är en enda stor MSCC). Kan grafen vara acyklisk (det vill säga, helt utan cykler)? Troliggör ditt påstående (eller visa formellt). Tips om du sitter fast: Rita ett par exempel på starkt sammanhängande grafer med - säg - 3-4 noder och studera dem. 12. (*) Vi har en riktad graf G=(V, E), och relationen R = {(v i, v j ) : v i tillhör samma komponent i G som v j } på V. Visa (eller troliggör) att R är en ekvivalensrelation. 2 Ersätter vi bågvikt med kapacitet så har detta en viktig tillämpning när man ska hitta maximala flöden i nätverk. Vi hittar kapaciteten på en flaskhals på vägen. Detta kan användas för att bland annat att hitta maximal överföringshastighet i nätverk, kapacitet för bilvägar eller - med särskilt valda grafer - för att kunna para ihop t ex organdonatorer med mottagare. 4
2 Dijkstras algoritm, pseudokod från Wikipedia DIJKSTRA (Graf G, startnod s) // Vi initierar alla noder i grafen. // Billigaste vägen (avståndet) är oändligt // och föregående nod är odefinierad för i tillhörande Noder(G) gör avstånd[i] = OÄNDLIGT föregångare[i] = NULL // Avståndet till startnoden är 0 avstånd[s] = 0 //markera startnoden som avsökt Avsökt( s ) medan inte alla noder avsökta gör // Finn den ej avsökta nod som har lägst nodpris // tills alla är avsökta i = Minimum( ej avsökta noder ) för j tillhörande närliggande(i) gör // Undersök om det finns en billigare väg // via nod i till närliggande noder om avstånd[j] > avstånd[i] + kostnad(i, j) gör avstånd[j] = avstånd[i] + kostnad(i, j) föregångare[j] = i Avsökt( i ) Observera att stoppkriteriet kan behöva utökas. Även: vi behöver inte hantera alla icke-avsökta noder om vi inte vill (varför inte?). 5