Vorlesungsmitschrift Graphentheorie 3 Speicherung von Graphen Speicherung von Graphen Ein Graph G = (X, K) mit X = {x1 , x2 , . . . , xn } und K = {k1 , k2, . . . , km } soll abgespeichert werden. 3.1 Darstellung durch Matrizen Adjazenzmatrix : Definition : Adjazenzmatrix A als quadratische Matrix mit ⎧ ⎨1 falls (xi ,xj ) ∈ K {xi ,xj } A = (aij )i,j=1,...,n mit aij = ⎩0 sonst Adjazenzmatrix Bemerkung : • parallele Kanten sind problematisch ( z.B. kann die Anzahl der Kanten abgespeichert werden ) • bei ungerichteten Graphen wird A symmetrisch Inzidenzmatrix : Definition : Inzidenzmatrix B = (bij )i=1,...,n mit Inzidenzmatrix j=1,...,m ⎧ ⎪ falls xi = p1 (kj ) ⎪ ⎨1 bij = −1 falls xi = p2 (kj ) ⎪ ⎪ ⎩ 0 sonst 1 falls xi ∈ p(kj ) bij = 0 sonst (gerichteter Graph) (ungerichteter Graph) Bemerkung : Schlingen sind problematisch 16 Vorlesungsmitschrift Graphentheorie Speicherung von Graphen Beispiel fu ¨ r gerichteten Graphen : ⎛ ⎜ ⎜ ⎜ ⎜ A=⎜ ⎜ ⎜ ⎜ ⎝ 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ⎞ ⎛ ⎟ ⎟ ⎟ ⎟ ⎟, ⎟ ⎟ ⎟ ⎠ ⎜ ⎜ ⎜ ⎜ B=⎜ ⎜ ⎜ ⎜ ⎝ 1 1 −1 0 0 0 0 −1 0 0 −1 −1 0 0 0 0 1 1 0 1 0 0 −1 0 0 1 −1 0 0 0 0 0 0 0 −1 0 0 0 0 0 0 1 ⎞ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ Bemerkung der Autoren : Bei der Adjazenzmatrix A repr¨asentiert jede Spalte einen Endknoten x, also x1 bis x6 , analog jede Zeile einen Anfangsknoten. ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ A=⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ 0 0 1 0 0 0 ↑ x1 1 0 1 1 0 0 ↑ x2 0 0 0 0 0 0 ↑ x3 1 0 1 0 0 0 ↑ x4 0 0 0 0 0 1 ↑ x5 0 0 0 0 0 0 ↑ x6 ← x1 ← x2 ← x3 ← x4 ← x5 ← x6 ⎞ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ Bei der Inzidenzmatrix B repr¨asentiert jede Spalte eine Kante k, also k1 bis k7 . Jede Zeile repr¨asentiert einen Knoten x, also x1 bis x6 . In jeder Spalte stehen eine 1 f¨ ur den Anfangsknoten und eine −1 f¨ ur den Endknoten. ⎛ ⎜ ⎜ ⎜ ⎜ ⎜ ⎜ B=⎜ ⎜ ⎜ ⎜ ⎜ ⎜ ⎝ 1 1 −1 −1 0 0 0 0 1 0 −1 0 0 0 0 0 0 0 ↑ ↑ ↑ k1 k2 k3 0 0 0 0 −1 −1 0 0 1 0 1 0 0 1 −1 0 0 0 0 −1 0 0 0 1 ↑ ↑ ↑ ↑ k4 k5 k6 k7 ← x1 ← x2 ← x3 ← x4 ← x5 ← x6 ⎞ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎟ ⎠ 17 Vorlesungsmitschrift Graphentheorie 3.2 Speicherung von Graphen Darstellung mit Listen Nachfolgerliste und zugeh¨ orige Indexliste : Zu jedem Knoten wird die Liste der Nachfolger gespeichert. Beispiel : 1 2 3 4 5 6 → → → → → → Nachfolgerliste 2, 4 leer 1, 2, 4 2 leer 5 Die Nachfolger werden in der Reihenfolge der Knoten aneinander geh¨angt : j nf[j] 1 2 2 4 3 1 4 2 5 4 6 2 7 5 Die Nachfolgerliste nf hat bei gerichteten Graphen die L¨ange m = |K|. Bei ungerichteten Graphen verdoppelt sich die L¨ange auf 2m = 2|K|. Durch Kenntnis des positiven Halbgrades d+ (i) bzw. des Grades d(i) kann die Liste nf wieder in die Teillisten aufgeteilt werden. N¨ utzlich ist die folgende Indexliste der L¨ange n + 1 = |X| + 1 : i inf[i] 1 1 2 3 3 3 4 6 5 7 6 7 7 8 Es gilt bei dieser Festlegung : d+ (i) = inf[i + 1] − inf[i] d(i) = inf[i + 1] − inf[i] (gerichteter Graph) (ungerichteter Graph) Die Nachfolger des Knotens xi sind nun folgende : nf[j] mit j = inf[i], . . . , inf[i + 1] − 1 18 Indexliste Vorlesungsmitschrift Graphentheorie Speicherung von Graphen Kantenlisten : Zu jeder Kante werden die Knoten gespeichert. F¨ ur obiges Beispiel : i ap[i] ep[i] 1 1 2 2 1 4 3 3 1 4 3 2 5 4 2 6 3 4 Kantenliste 7 6 5 wobei i die Kante ki , ap der Anfangsknoten der Kante ki und ep der Endknoten der Kante ki sind. Bemerkungen : 1. Anstelle einer Nachfolgerliste nf und der zugeh¨origen Indexliste inf kann auch mit einer Vorg¨angerliste plus Indexliste gearbeitet werden. 2. Es ist n¨ utzlich, die Kanten wie folgt zu nummerieren : (a) Knoten 1 : alle dort ausgehenden Kanten erhalten die Nummern 1, 2, . . . , j1 (b) Knoten 2 : alle dort ausgehenden Kanten erhalten die Nummern j1 + 1, . . . , j2 (c) usw. Folgerung : • Vom Knoten xi gehen jetzt die Kanten mit den Nummern inf[i],. . . , inf[i + 1] − 1 aus • Die Nachfolgerliste stimmt mit der Endpunktliste u ¨berein 19 Vorlesungsmitschrift Graphentheorie 3.3 Speicherung von Graphen Algorithmus zum Richten eines Graphen Gegeben ist ein ungerichteter Graph G(X, K) der L¨ange |K| = m, der mittels einer Kantenliste ap und ep definiert ist. Gesucht ist der zugeh¨orige gerichteter Graph G (X, K ), der durch die Nachfolgerliste nf und zugeh¨orige Indexliste inf definiert ist. Richten eines Graphen Schritte: 1. Bestimmung von d(i) 2. Bestimmung von inf 3. Bestimmung von nf Listing 1: Richten“eines ungerichteten Graphen ” 1 VAR N , M : i n t e g e r; 2 3 4 5 TYPE PListe = ARRAY [1.. N +1] OF i n t e g e r; KListe = ARRAY [1.. M ] OF i n t e g e r; K G L i s t e = ARRAY [1..2* M ] OF i n t e g e r; 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 P R O C E D U R E R i c h t e n ( AP , EP : KListe ; inf ,D , H : PLISTE ; nf : K G L i s t e ) VAR i ,j ,k , l : i n t e g e r; BEGIN // S c h r i t t 1 : Grad der Knoten e r m i t t e l n FOR i :=1 TO N DO D [ i ]:=0; FOR k :=1 TO M DO BEGIN i := AP [ k ]; D [ i ]:= D [ i ]+1; i := EP [ k ]; D [ i ]:= D [ i ]+1; END ; // S c h r i t t 2 : I n d e x l i s t e e r s t e l l e n inf [ 1 ] : = 1 ; FOR i :=1 TO N DO inf [ i +1]:= inf [ i ] + D [ i ]; // S c h r i t t 3 : N a c h f o l g e r l i s t e e r s t e l l e n FOR i :=1 TO N DO H [ i ]:= inf [ i ]; FOR k :=1 TO M DO BEGIN i := AP [ k ]; j := EP [ k ]; l := H [ i ]; nf [ l ]:= j ; H [ i ]:= H [ i ] + 1 ; / / Hin - Kante l := H [ j ]; nf [ l ]:= i ; H [ j ]:= H [ j ] + 1 ; / / Zurueck - Kante END ; END ; 20