729G04 - Diskret matematik. Lektion 4 1 Lösningsförslag 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. Exempelvis a{a, b}b{b, c}c. När vi har en enkel graf och det är helt entydigt vilken båge som leder från a till b kan vi skriva detta lite kortare som a b c. b) Beskriv en väg i grafen. Finns det en väg som inte är en stig? Beskriv den isåfall. En väg har inga upprepade kanter/bågar. Ett exempel är j i d c b d. Denna är inte heller en stig (för vi upprepar noden d). c) Beskriv en stig i grafen. Finns det en stig som inte är en väg? Beskriv den isåfall. En stig har inga upprepade noder (utom möjligen om första = sista nod). Ett exempel är a b c. d) Är grafen cykelfri? Nej. Vi kan till exempel hitta a b c a. 1.2 Sammanhängandebegreppet, komponenter 2. Konstruera en delgraf G G (G från uppgiften ovan) som är en skog (en samling träd). Vi behöver åtminstone två träd. En enkel variant: G = (V, E ) där V = {a, b, c, f, g}, E = {{a,b}, {b, c}, {f, g}} 1
3. Betrakta grafen från uppgift 1 ovan. a) Vilka är komponenterna i grafen? Grafen med noderna a, b, c, d, i, j (och bågarna dem emellan) är en komponent. Grafen med f, g (och bågen dem emellan) en annan. Slutligen är grafen med (den isolerade) noden h en komponent. b) Är G = (V, E ), V = {a, b, c}, E = {{a, b}, {b, c}, {c, a}} en komponent i grafen? Bevis eller motexempel. Nej. Vi kan hitta en större sammanhängande delgraf, som G bara är en delgraf av. Informellt: lägg till noden d och (åtminstone en) båge till den för att hitta en större komponent. Mer formellt: Låt G = (V, E ), V = {a, b, c, d}, E = {{a, b}, {a, c}, {b, c}, {b, d}, {c, d}}. (Här har vi lagt till d och alla bågar till den.). Då är G G (G delgraf, men G innehåller något ytterligare), och G är sammanhängande. Därmed är inte G maximal, och inte en komponent. 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. Informellt har vi följande uppdelning (fyll gärna ut till en fullständig beskrivning av grafer): Noderna {a, f} och bågarna dem emellan. Noderna {b, c, d} och bågarna dem emellan. Noden {g}. Noden {h} (Uppdaterat). 5. Den riktade grafen ovan är inte acyklisk. a) Bekräfta det. Vi har exempelvis en cykel a f a (fler finns, vi behöver bara påvisa en). 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? Två. Vi måste bryta cyklerna a f a och b c d b. Detta går att göra genom att ta bort en av bågarna (a, f) eller (f, a), och att vända någon av bågarna mellan b, c, d. När vi gör detta uppstår inga nya cykler (potentiellt problem i en större graf, så det måste bekräftas). 2
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. Det finns ingen som direkt eller indirekt samarbetat med alla (spelat i samma film som någon som spelat i samma film som...). 1.3 Billigaste vägar (med mera) 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? Kortaste vägen är a b d c f g i, kostnad 0 + 1 + 2 + 5 + 0 + 3 = 11. Vi beskriver ett par steg i sökprocessen: Initialt: vi sätter distans = för alla noder utom startnoden, och distans för startnoden till 0. Ingen nod har föregångare. Vi har noder att avsöka ( active set ) som enbart består av startnoden a, och inga klara än. Vi markerar de aktiva noderna nedan fetstilt. Strikt taget behöver vi inte hålla koll på detta (och pseudokoden inkluderar inte sådant, även om föreläsningsgenomgången gjorde det). Det finns däremot ofta praktiska skäl att göra det. Framförallt blir det färre noder att söka igenom i varje varv, och det blir möjligt att söka i 3
extremt stora grafer (tänk: personer på facebook, datorer på internet) utan att behöva lagra hela grafen i minnet 1 a 0 - c - d - g - Vi väljer den billigaste noden av de aktiva, nämligen a. Den har grannar b och c. Granne c har inte avsökts sedan tidigare, och den har distans[c] = > distans[a] + c ac = 0 + 5 (c ac här utläses kostnaden för bågen a c). Därför uppdaterar vi grannen c:s distans och föregångare, och lägger till den till noder att avsöka. Vi gör samma sak med b. a 0 - Klar b 0 a c 5 a d - g - Billigast nu är b. Vi väljer den, undersöker grannar d, h och får tabellen: a 0 - Klar b 0 a Klar c 5 a d 1 b g - h 2 b 1 Teknisk detalj, som bara är relevant om du vill skriva en egen implementation (och inte annars): en lätt modifikation krävs såklart av lagrade vägkostnader isåfall, så att man inte behöver sätta d = för allt i världen. 4
När vi nu väljer att avsöka d märker vi att vi hittar en kortare väg till c. distans[c] = 5 från början, men distans[d] + c dc = 1 + 2 = 3. Så vi uppdaterar distans[c] och föregångare: a 0 - Klar b 0 a Klar c 5 3 a d d 1 b Klar g 9 d h 2 b Vi bygger vidare, och efter ett antal steg får vi a 0 - Klar b 0 a Klar c 5 3 a d Klar d 1 b Klar f 8 c Klar g 9 8 d f Klar h 2 b Klar i 12 11 f g Nu börjar vi söka utifrån målet i. I detta steg kan vi avsluta. Vi hittar kortaste vägen genom att se på slutmålet i. I tabellen kan vi avläsa vilken dess närmsta föregångare på kortaste vägen 2 är g. Föregångaren på kortaste vägen g, så kedjan ser ut som a... g i. Föregångare till g är f, så vi har kortaste vägen a... f g i. Fortsätter vi söka hela vägen tillbaka ser vi vägen a b c f g i. b) Hitta den billigaste vägen från g till b (om den finns). Vilken blir kostnaden? Vilken är vägen? Det finns ingen sådan väg. Detta märker vi genom körning av Dijkstras algoritm (eller t ex komponentuppdelning). 2 I denna graf finns bara en kortaste väg. Dijkstra kommer, om man inte modifierar den, ge en av de kortaste vägarna om det finns flera som är lika långa. 5
c - d - g 0 - Vi uppdaterar grannarna f, i. c - d - f 1 g i 3 g Utgå från nod f. Grannar: d, i. c - d 1 f f 1 g Klar i 3 g Utgå från nod d. Grannar: c, g. (g redan klar). c 3 d d 1 f Klar f 1 g Klar i 3 g Utgå från nod c (vi kunde valt i - som har samma beräknad distans 6
- också, det hade inte spelat någon roll för slutresultatet). Grannar: f. (f redan klar). c 3 d Klar d 1 f Klar f 1 g Klar i 3 g Utgå från nod i. Inga grannar. c 3 d Klar d 1 f Klar f 1 g Klar i 3 g Klar Och därmed är vi klara. Vi har inga aktiva noder att avsöka, och vi har inte kunnat nå målet. Därmed kan vi konstatera att det inte finns en väg g b i grafen. 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. Algoritmidé: se på sökningen ovan. Om vi istället för att sluta när vi hittat ett visst mål, fortsätter fylla på tabellen tills vi hittat alla kortaste vägar med start i f, så kommer vi att hitta alla nåbara noder. De nåbara noderna är samma som ovan: c, d, f, g, i. 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. 7
Idé Vi använder samma modifierade algoritm som i uppgiften ovan. Det enda vi behöver tänka på här är att vi ska räkna antalet steg, så vi tar grafen i uppgiften och ger varje båge vikten 1. Diametern blir 4. 1.4 Blandat 9. Vi ges grafen från avsnitt 7 ovan. Vilka komponenter har den? Beskriv de respektive delgraferna. Informellt (återigen: beskriv graferna!) Komponenten med noden a. Komponenten med noden b. Komponenten med noden h. Komponenten med noden i. (Uppdaterat) Komponenten med noderna c, d, f, g. 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å? Svar Bågarna (a, b), (a, c), total vikt 0 + 5 = 5. 11. Nej! Grafen har åtminstone två noder v i v j. Eftersom den är starkt sammanhängande så finns det vägar mellan varje par av noder. Så det finns (åtminstone) en väg v i v j och (åtminstone) en väg v j v i. Men då finns det en cykel v i v j v i. 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. Reflexiv. För varje nod v V så tillhör v samma komponent som sig själv. 8
Symmetrisk. Om u V och v V tillhör samma komponent (urv), så tillhör v och u samma komponent (vru). Detta är självklart när man skriver ut det, men det vi behövde bekräfta var urv vru u, v V. Transitiv. Antag att vi har noder u, v, w V sådana att urv, vrw. Vi ska visa att urw. Här behöver vi se lite mer noga på vad det innebär att de tillhör samma komponent. Då urv så tillhör u och v samma komponent i grafen. Det finns därmed en promenad u v, och en v u (det finns kanske flera, men vi intresserar oss bara för att det går att ta sig mellan noderna på något sätt). Då vrw så finns en promenad v w och vice versa. Vi vill visa att det finns en promenad u w och en w u i grafen. Sätter vi ihop resultaten ovan får vi u v w i komponenten och w v u i komponenten. Därmed tillhör u, w samma komponent, och urw. 9