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