You are on page 1of 70

Δομές

Δεδομένων
VΙI
Γράφοι
Ελένη Γαλιώτου
ΕΙΣΑΓΩΓΗ

Δομή Γράφου: Η πιο γενική μορφή δομής δεδομένων


Ένας γράφος αποτελείται από:
ένα σύνολο κόμβων (nodes) ή κορυφών (vertices) ή σημείων (points)
και
ένα σύνολο ακμών (edges) ή τόξων (arcs) ή γραμμών (lines)
ΟΡΙΣΜΟΣ
• Ένας γράφος είναι ένα διατεταγμένο ζεύγος G=(V,E) όπου
• V={v1, v2, …, vn} με n>0 είναι το σύνολο των κόμβων
• Ε = { {x, y} με x,y, V } το σύνολο των ακμών με |Ε| ≥ 0
• Ο γράφος καλείται
• κατευθυνόμενος αν οι ακμές του είναι προσανατολισμένες προς μία
κατεύθυνση
• μη κατευθυνόμενος αν όχι
• Προσανατολισμός ακμής: ορίζεται με ένα βέλος
ΠΑΡΑΔΕΙΓΜΑΤΑ (1/2)

Σχήμα 1. Μη κατευθυνόμενοι γράφοι


ΠΑΡΑΔΕΙΓΜΑΤΑ (2/2)

Σχήμα 2. Κατευθυνόμενοι γράφοι


ΖΥΓΙΣΜΕΝΟΙ ΓΡΑΦΟΙ

• Ορισμός: Ζυγισμένος γράφος (weighted graph) ονομάζεται ο γράφος του οποίου


κάθε ακμή χαρακτηρίζεται από έναν αριθμό που αποκαλείται βάρος (weight).
• Στις εφαρμογές το βάρος μπορεί να δηλώνει :
• τον χρόνο μετάβασης από ένα κόμβο στον άλλο
• την απόσταση των δύο κόμβων
• Το κόστος
Σχήμα 3. Ενας ζυγισμένος γράφος
ΠΑΡΑΤΗΡΗΣΗ

• Τα σύνολα V και E ορίζουν πλήρως ένα γράφο


• Όχι η θέση των κόμβων ή το σχήμα και το μήκος των ακμών στη γεωμετρική
απεικόνισή τους
• Άρα, ο ίδιος γράφος μπορεί να αναπαρασταθεί γεωμετρικά με πολλά ισοδύναμα
σχήματα
ΤΟ ΠΡΟΒΛΗΜΑ ΤΩΝ ΓΕΦΥΡΩΝ ΤΟΥ KOENIGSBERG (1/2)
Koenigsberg : τότε πόλη της Ανατολικής Πρωσίας (σήμερα της Ρωσίας: Καλίνινγκραντ)
Πρόβλημα: Να βρεθεί τρόπος να διασχίσει κάποιος το Koenigsberg
περνώντας από τις γέφυρές του ακριβώς μία φορά από κάθε μία

Σχήμα 4. Άποψη των γεφυρών του Koenigsberg


ΤΟ ΠΡΟΒΛΗΜΑ ΤΩΝ ΓΕΦΥΡΩΝ ΤΟΥ KOENIGSBERG (2/2)

Euler (1736):
Απέδειξε ότι αυτό είναι αδύνατο, παρατηρώντας ότι οι περιοχές Α, Β, Γ της ξηράς
έχουν περιττό αριθμό γεφυρών
Το πρόβλημα στη γενική του μορφή: Εύρεση μίας διαδρομής Euler όταν υπάρχει
Η λύση του Euler παραμένει η βάση για τον καλύτερο αλγόριθμο που υπάρχει
μέχρι σήμερα για τη λύση του προβλήματος
ΑΠΟΘΗΚΕΥΣΗ ΓΡΑΦΩΝ
Πίνακας γειτνίασης (adjacency matrix) ή πίνακας
διπλανών κορυφών
Μη ζυγισμένος γράφος με n κόμβους,
Πίνακας γειτνίασης A = (aij) με i, j = 1, 2, …, n,
aij = 1 εάν υπάρχει ακμή από τον κόμβο vi στον κόμβο vj
aij = 0 αν δεν υπάρχει
Πίνακας γειτνίασης: Δυαδικός
=> μπορεί να χρησιμοποιηθεί μόνο ένα bit για κάθε κόμβο
Διάσταση του πίνακα: n,
=> πλήθος στοιχείων του: n2
Λίστα γειτνίασης (adjacency list) ή λίστα διπλανών
κορυφών

• Μη ζυγισμένος γράφος με n κόμβους,


• Λίστα γειτνίασης:
• αποτελείται από n λίστες
• i-οστή λίστα : κόμβοι προς τους οποίους υπάρχει ακμή από τον κόμβο vi
• Kάθε κόμβος καταλαμβάνει μεγαλύτερο χώρο
• γειτονικός κόμβος + δείκτης προς τον επόμενο κόμβο
Σχήμα 5. Πίνακας γειτνίασης και λίστα γειτνίασης του
γράφου του σχήματος 2γ
ΑΝ Ο ΓΡΑΦΟΣ ΕΙΝΑΙ ΖΥΓΙΣΜΕΝΟΣ…
• Ο αντίστοιχος πίνακας θα περιέχει τα βάρη (αντί τα 1)
• Πίνακας πραγματικών αριθμών
• Όπως και πριν, διάσταση n, πλήθος στοιχείων n2
• Κάθε κόμβος της λίστας γειτνίασης θα περιέχει:
• γειτονικό κόμβο
• δείκτη προς επόμενο κόμβο
• βάρος
Σχήμα 6. Πίνακας γειτνίασης και λίστα γειτνίασης
του γράφου του σχήματος 3
ΠΑΡΑΤΗΡΗΣΕΙΣ
Μη κατευθυνόμενοι γράφοι
Συμμετρικός πίνακας γειτνίασης
άρα μπορεί με κατάλληλο τρόπο να αποθηκευθεί ο μισός
Λίστες γειτνίασης
Αποθηκεύονται οι ακμές αντί των κόμβων
Άρα, αν οι ακμές είναι σχετικά λίγες , τότε η λίστα γειτνίασης είναι πιο οικονομική
από τον αντίστοιχο πίνακα
Παράδειγμα: Γράφος με 100 κόμβους και 500 ακμές
Αποθήκευση σε πίνακα 10.000 θέσεων ή σε λίστα 500 κόμβων
Πρόταση:
• Ο μεγαλύτερος αριθμός ακμών σε μη κατευθυνόμενο γράφο με n κόμβους είναι n(n-
1)/2, ενώ σε κατευθυνόμενο γράφο είναι n(n-1)
• Πλήρης (complete) γράφος
• Έχει ακριβώς το μέγιστο πλήθος ακμών (π.χ. σχήμα 3)
• Πυκνός (dense) γράφος
• Ο αριθμός των ακμών του είναι μεγάλος σε σχέση με το μέγιστο
• Αραιός (sparse) γράφος, διαφορετικά
• Συμφέρει η αποθήκευσή του σε λίστα
• Περιγραφή γράφου με λίστα γειτνίασης:
• Οδηγεί σε ταχύτερους αλγορίθμους για Η/Υ χωρίς παραλληλισμό
ΒΑΣΙΚΟΙ ΟΡΙΣΜΟΙ
ΚΑΙ ΠΡΟΤΑΣΕΙΣ
ΥΠΟΓΡΑΦΟΣ (SUBGRAPH)

Ορισμός: Ένας υπογράφος ενός γράφου G είναι ένας γράφος του οποίου
οι κόμβοι και οι ακμές υπάρχουν και στο G

Σχήμα 7. Ο γράφος (H) είναι υπογράφος του (G)


ΔΙΑΔΡΟΜΗ
Διαδρομή (route) ή μονοπάτι (path):
Ένα σύνολο κόμβων ενός γράφου, αν υπάρχουν ακμές που ενώνουν
διαδοχικά τους κόμβους αυτούς.
Μήκος διαδρομής: Ο αριθμός των ακμών της
Απλή διαδρομή: Όταν όλοι οι κόμβοι είναι διαφορετικοί
Κύκλος: Διαδρομή της οποίας ο πρώτος κόμβος συμπίπτει με τον τελευταίο
Απόσταση (distance) μεταξύ δύο κόμβων:
Το μήκος της συντομότερης διαδρομής που οδηγεί από τον ένα κόμβο στον
άλλο.
ΓΡΑΦΟΙ (1/2)
Άκυκλος ή μη κυκλικός: Ένας γράφος που δεν περιέχει κύκλους
Γράφος Euler:
Περιέχει μία διαδρομή Euler, δηλ. διαδρομή που περνά από όλες τις
ακμές του ακριβώς μία φορά
Γράφος Hamilton:
Περιέχει μία διαδρομή Hamilton, δηλ. διαδρομή που περνά από όλους
τους κόμβους ακριβώς μία φορά.
ΓΡΑΦΟΙ (2/2)

Συνεκτικός (connected) γράφος: Για κάθε ζεύγος κόμβων υπάρχει διαδρομή που τους
συνδέει
Σχήμα 1: Οι γράφοι (α) και (β) είναι συνεκτικοί, ο (γ) δεν είναι
Δισυνεκτικός γράφος: Για κάθε ζεύγος κόμβων υπάρχουν δύο ξένες μεταξύ τους
διαδρομές που τους συνδέουν
Σχήμα 1: Ο γράφος (β) είναι δισυνεκτικός
Συνεκτική (δισυνεκτική) συνιστώσα ενός γράφου: Ένας μέγιστος συνεκτικός
(δισυνεκτικός) υπογράφος του
Σχήμα 1: Δισυνεκτικές συνιστώσες του (α): {Α, Β, Γ}, {Δ}
Συνεκτικές συνιστώσες του (γ): {Α, Β, Γ}, {Δ, Ε}
ΒΑΘΜΟΣ
Βαθμός (degree) ενός κόμβου σε ένα μη κατευθυνόμενο γράφο: Ο αριθμός
των ακμών που ξεκινούν από αυτόν τον κόμβο.
Σχήμα 1β: Βαθμός του κόμβου Ε =3
Βαθμός του κόμβου Γ = 2
Αντίστοιχες έννοιες σε κατευθυνόμενο γράφο
Βαθμός εισόδου (in-degree): αριθμός ακμών που καταλήγουν
Βαθμός εξόδου (out-degree): αριθμός ακμών που ξεκινούν από έναν
κόμβο
Σχήμα 2α: Βαθμός εισόδου στον κόμβο Α: 2
Βαθμός εξόδου: 1
ΔΕΝΔΡΑ (1/3)
• Ειδική κατηγορία γράφων
• Ισοδύναμες προτάσεις (~ ορισμός του δένδρου Δ).
• Το Δ είναι συνεκτικός και μη κυκλικός γράφος
• Κάθε ζεύγος κόμβων του Δ συνδέεται με ακριβώς μία διαδρομή
• Το Δ είναι συνεκτικός γράφος και έχει n-1 ακμές
• Το Δ είναι μη κυκλικός γράφος και έχει n-1 ακμές
• Το Δ είναι συνεκτικός γράφος, αλλά αν του αφαιρεθεί οποιαδήποτε ακμή
παύει να είναι συνεκτικός
ΔΕΝΔΡΑ (2/3)

Δάσος (forest): γράφος που αποτελείται από συλλογή δένδρων


Δένδρο-σκελετός (spanning tree) ενός συνεκτικού γράφου G: Ένας
υπογράφος του G που είναι δένδρο και έχει κόμβους όλους τους κόμβους
του G
Δάσος-σκελετός (spanning forest ) ενός μη συνεκτικού γράφου G:
Ανάλογος ορισμός
ΔΕΝΔΡΑ (3/3)

Σχήμα 8. Δένδρα σκελετοί του γράφου του σχήματος 1β


ΠΡΟΒΛΗΜΑΤΑ ΚΑΙ
ΑΛΓΟΡΙΘΜΟΙ
ΔΙΑΣΧΙΣΗ ΓΡΑΦΩΝ
Πρόβλημα ανάλογο με τη διάσχιση δένδρου
Δοθέντος ενός μη κατευθυνόμενου γράφου, να γίνει η επίσκεψη όλων των κόμβων
ξεκινώντας από έναν από αυτούς.
Αλγόριθμος διάσχισης γράφου κατά βάθος (depth-first):
Επισκέπτεται όλους τους κόμβους του γράφου πηγαίνοντας κάθε φορά και σε ένα
κόμβο ο οποίος είναι γειτονικός (δηλ. ενώνεται με ακμή με τον προηγούμενο)
Αν δεν υπάρχει τέτοιος κόμβος, γίνεται οπισθοδρόμηση (backtracking)
ΑΛΓΟΡΙΘΜΟΣ DFS (DEPTH-FIRST) (1/2)
Αποθήκευση γράφου:
Πίνακας γειτνίασης a(i,j) διαστάσεων NxN
Σημείωση επίσκεψης αντίστοιχου κόμβου
Μονοδιάστατος πίνακας mark()
mark(i) = 1 => έχουμε επισκεφθεί τον κόμβο i
Αρχικά όλα τα στοιχεία του mark είναι 0
Αναδρομικός αλγόριθμος
Καλείται από άλλον αλγόριθμο με τιμή του k τον
αριθμό του κόμβου έναρξης
Οι μεταβλητές a, mark, N ορίζονται ως καθολικές
ΑΛΓΟΡΙΘΜΟΣ DFS (DEPTH-FIRST) (2/2)
Γενικός αλγόριθμος που αποτελεί βασικό συστατικό πολλών
συνθετότερων αλγορίθμων για γράφους.
Π.χ. Πρόβλημα διάσχισης λαβυρίνθου
΄δεν δίνει τη λύση αλλά …
Αποτελεί τη βάση για τη διατύπωση ειδικού αλγορίθμου
Εξασφαλίζει ότι κάποιος θα διασχίσει κάθε ακμή του γράφου δύο μόνο
φορές – μία για κάθε κατεύθυνση
ΔΙΑΣΧΙΣΗ ΛΑΒΥΡΙΝΘΟΥ
Σχήμα 9:
(α) Ο κήπος του Hampton-Court Palace
(β) Ο γράφος που αντιστοιχεί στον
λαβύρινθο του Hampton-Court Palace
Το πρόβλημα της διάσχισης λαβυρίνθου
λύθηκε μόνο προς το τέλος του 190υ
αιώνα
ΔΙΑΣΧΙΣΗ ΚΑΤΑ ΠΛΑΤΟΣ
Δεδομένων ενός γραφήματος G=(V,E) και ενός κόμβου s ∈V (κόμβος ρίζα
ή κόμβος εκκίνησης),
Η διάσχιση κατά πλάτος συνίσταται στον εντοπισμό όλων των κόμβων που είναι
προσπελάσιμοι από τον s.
Κατά την εκτέλεση μιας διάσχισης κατά πλάτος στον G:
Δημιουργείται ένα δένδρο με ρίζα τον κόμβο s που περιέχει όλους τους κόμβους
του G που είναι προσπελάσιμοι από τον s (δένδρο «κατά πλάτος»),
Υπολογίζεται η απόσταση, (το μήκος του συντομότερου μονοπατιού, από τον s
προς οποιονδήποτε κόμβο v (δ(s,v)).
ΔΙΑΣΧΙΣΗ ΚΑΤΑ ΠΛΑΤΟΣ

Η διάσχιση των κόμβων γίνεται «κατά πλάτος»:


Η διάσχιση οποιουδήποτε κόμβου σε απόσταση k+1 από τον s πραγματοποιείται
μόνο όταν όλοι οι κόμβοι σε απόσταση k από τον s έχουν διασχισθεί
ΑΛΓΟΡΙΘΜΟΣ ΔΙΑΣΧΙΣΗΣ ΚΑΤΑ ΠΛΑΤΟΣ (συν.)

Ο αλγόριθμος χρωματίζει κάθε κόμβο του γράφου λευκό, γκρίζο ή μαύρο.


Λευκοί κόμβοι: δεν έχουν ακόμη εξερευνηθεί.
Ένας κόμβος θεωρείται πως έχει εξερευνηθεί την πρώτη φορά που
συναντάται στη διάσχιση, οπότε και καθίσταται μη λευκός.
Γκρίζοι κόμβοι: έχουν εξερευνηθεί αλλά ίσως έχουν γείτονες που δεν έχουν
ακόμη εξερευνηθεί (δηλαδή που είναι ακόμη λευκοί).
Αποτελούν το σύνορο μεταξύ μαύρων και λευκών κόμβων.
Μαύροι κόμβοι: κόμβοι των οποίων όλοι οι γείτονες έχουν εξερευνηθεί
(δηλαδή οι γειτονικοί κόμβοι αυτών είναι είτε γκρίζοι ή μαύροι).
Ο διαχωρισμός μεταξύ γκρίζων και μαύρων κόμβων γίνεται για να
εξασφαλισθεί ότι η διάσχιση των κόμβων θα γίνει «κατά πλάτος».
ΑΛΓΟΡΙΘΜΟΣ ΔΙΑΣΧΙΣΗΣ ΚΑΤΑ ΠΛΑΤΟΣ

Βασικές Ιδέες Αλγορίθμου


• Αρχικά, ο μοναδικός γκρίζος κόμβος είναι ο s.
• Κάθε χρονική στιγμή, οι γκρίζοι κόμβοι είναι αποθηκευμένοι σε
μια ουρά Q (που αρχικά περιέχει μόνο τον s).
Επαναληπτικά, εκτελούνται τα εξής:
1. Εξαγωγή ενός γκρίζου κόμβου u από την Q;
2. Διερεύνηση των γειτονικών κόμβων του u και εισαγωγή στην ουρά
όσων είναι λευκοί.
ΑΛΓΟΡΙΘΜΟΣ ΔΙΑΣΧΙΣΗΣ ΚΑΤΑ ΠΛΑΤΟΣ (συν.)

3. Ακριβώς πριν την εισαγωγή στην Q ενός λευκού κόμβου v εκτελούνται


τα εξής:
• Το χρώμα του v αλλάζει σε γκρίζο.
• Ο u ορίζεται να είναι ο γονικός κόμβος του v στο «κατά πλάτος» δένδρο
που δημιουργείται και η ακμή (u,v) εισάγεται στο δένδρο (ο u ονομάζεται
προκάτοχος του v στο δένδρο).
• Η απόσταση του v από τον κόμβο εκκίνησης s υπολογίζεται και
καταχωρείται σε ένα κατάλληλο πεδίο του struct του κόμβου v.
4. Όταν όλοι οι γειτονικοί κόμβοι του u έχουν εξετασθεί (και οι ενέργειες
του βήματος 3 έχουν εκτελεστεί για όσους εξ αυτών είναι λευκοί), το χρώμα του
u αλλάζει σε μαύρο.
ΑΛΓΟΡΙΘΜΟΣ ΔΙΑΣΧΙΣΗΣ ΚΑΤΑ ΠΛΑΤΟΣ (συν.)

• Ο κώδικας υποθέτει ότι ο γράφος G αναπαρίσταται μέσω λίστας γειτνίασης.


• Σε κάθε κόμβο v του γράφου διατηρούνται διάφορες πληροφορίες:
• o v->c: το χρώμα του κόμβου v
• o v->d: η απόσταση του κόμβου v από τον s
• o v->p: ο γονικός κόμβος του v στο κατά πλάτος δένδρο
• Ο αλγόριθμος χρησιμοποιεί μια ουρά Q για τη διαχείριση του συνόλου των γκρίζων
κόμβων.
ΑΛΓΟΡΙΘΜΟΣ ΔΙΑΣΧΙΣΗΣ ΚΑΤΑ ΠΛΑΤΟΣ (συν.)
Διάσχιση «Κατά Πλάτος» while (!IsEmptyQueue(Q)) {
procedure BFS(graph G, node s) { u = Dequeue(Q);
Queue Q; // διάσχιση λίστας γειτονικών κόμβων
node u, v; του u
foreach node u  V(G) – {s} { foreach v  u->Adj {
u->c = WHITE; Αρχικοποίηση if (v->c = WHITE) {
u->d = ; κόμβων v->c = GRAY;
u->p = nil; γράφου v->d = u->d+1;
} v->p = u;
s->c = GRAY; Enqueue(Q,v);
s->d = 0; Αρχικοποίηση }
s->p = nil; κόμβου s }
και ουράς Q u->c = BLACK;
MakeEmptyQueue(Q);
Enqueue(Q, s); }
ΔΙΑΣΧΙΧΗ ΚΑΤΑ ΠΛΑΤΟΣ
ΕΛΑΧΙΣΤΟΣ ΔΡΟΜΟΣ

Πρόβλημα: Εύρεση του ελάχιστου δρόμου μεταξύ δύο κόμβων ενός


ζυγισμένου γράφου.
Π.χ. Σε μία μεγάλη πόλη ζητείται να βρεθεί, ποιο είναι το συντομότερο
δρομολόγιο μεταξύ δύο ακραίων συνοικιών
Υποθέτουμε ότι είναι γνωστή η μέση διάρκεια (ή απόσταση) μεταξύ των
διαφόρων συνοικιών, εκεί όπου η πρόσβαση είναι δυνατή
Ενας από του πολλούς αλγορίθμους: Ο αλγόριθμος Ford
ΑΛΓΟΡΙΘΜΟΣ FORD (1/2)

Σε κάθε κόμβο i, δίδεται προσωρινά η τιμή λi, ίση με 0, για τον πρώτο κόμβο
και ίση με ∞ για τους υπόλοιπους.
Υπολογίζονται οι διαφορές λj – λi για κάθε τόξο i,j και
αν λj – λi > aij τότε
λj = λi + aij όπου aij το βάρος του τόξου
Η διαδικασία τερματίζεται αν δε μπορεί μπορεί να μεταβληθεί άλλο λi
ΑΛΓΟΡΙΘΜΟΣ FORD (2/2)
Η τιμή λn που βρέθηκε στον τελευταίο κόμβο είναι η ελάχιστη διάρκεια
του δρομολογίου
Για την εύρεση του ελάχιστου δρόμου, γίνεται η αντίστροφη διαδικασία.
Ξεκινώντας από το τέλος, αν η διαφορά λj – λi ισούται με aij τότε το
τόξο i,j ανήκει στον ελάχιστο δρόμο

Σημ. Στον αλγόριθμο αυτόν, αν δεν υπάρχει κάποιο τόξο i-j, τότε a(i,j) = ∞
ΤΟ ΠΡΟΒΛΗΜΑ ΤΟΥ ΠΕΡΙΟΔΕΥΟΝΤΟΣ ΠΩΛΗΤΗ
(TRAVELLING SALESMAN PROBLEM) (1/5)
Δεδομένα: Πόλεις
Ζητείται ο συντομότερος δρόμος που θα ακολουθήσει ένας περιοδεύων
πωλητής για να επισκεφθεί τελικά όλες τις πόλεις μία μόνο φορά και να
επιστρέψει στην αρχική
Αναπαράσταση: Με ένα γράφο όπου
οι πόλεις θεωρούνται ως κόμβοι και οι δρόμοι σύνδεσης των πόλεων ως
ακμές που συνδέουν δύο σημεία.
στις ακμές υπάρχουν βάρη που αντιστοιχούν στις αποστάσεις μεταξύ
των αντίστοιχων πόλεων
Ζητούμενο: Εύρεση της συντομότερης διαδρομής που περνά από
όλους τους κόμβους ( κύκλος Hamilton )
ΤΟ ΠΡΟΒΛΗΜΑ ΤΟΥ ΠΕΡΙΟΔΕΥΟΝΤΟΣ ΠΩΛΗΤΗ
(TRAVELLING SALESMAN PROBLEM) (2/5)
ΤΟ ΠΡΟΒΛΗΜΑ ΤΟΥ ΠΕΡΙΟΔΕΥΟΝΤΟΣ ΠΩΛΗΤΗ
(TRAVELLING SALESMAN PROBLEM) (3/5)
1η προσέγγιση: άπληστος (greedy) αλγόριθμος
Επιλέγεται κάθε φορά η μετάβαση προς την πιο κοντινή πόλη
Σειρά επίσκεψης: 1 => 2 => 4 => 3 => 1 με συνολική απόσταση:
5+8+10+13=36 χλμ
Για κάθε πόλη πρέπει να βρίσκει την ελάχιστη απόσταση από τις
υπόλοιπες (n-1) πόλεις είναι πολυπλοκότητας O(n2)
ΤΟ ΠΡΟΒΛΗΜΑ ΤΟΥ ΠΕΡΙΟΔΕΥΟΝΤΟΣ ΠΩΛΗΤΗ
(TRAVELLING SALESMAN PROBLEM) (4/5)
2η προσέγγιση: Εύρεση της διαδρομής που έχει την ελάχιστη συνολική απόσταση
Πρέπει να βρεθούν όλες οι δυνατές διαδρομές και να επιλεγεί η μικρότερη
Ξεκινώντας από την πόλη 1 ο πωλητής πρέπει να επισκεφθεί τις 2, 3, 4.
Οι δυνατές μεταθέσεις των τριών πόλεων είναι 6 αλλά οι δυνατές διαδρομές 3 (η
διαδρομή 2, 3, 4 έχει ίδια απόσταση με την 4, 3, 2)

Μικρότερη είναι η διαδρομή 1 => 2 => 3 => 4 => 1 με συνολική απόσταση


5+9+10+6=30 χλμ
Πρέπει να βρει την ελάχιστη διαδρομή μεταξύ (n-1)!/2 δυνατών διαδρομών
οπότε είναι πολυπλοκότητας O(n!)
ΤΟ ΠΡΟΒΛΗΜΑ ΤΟΥ ΠΕΡΙΟΔΕΥΟΝΤΟΣ ΠΩΛΗΤΗ
(TRAVELLING SALESMAN PROBLEM) (5/5)
Σχόλια:
Αν αριθμός των πόλεων είναι σχετικά μικρός, το πρόβλημα μπορεί να
λυθεί σε αποδεκτό χρόνο
Για μεγαλύτερους αριθμούς, το πρόβλημα μπορεί να απαιτεί
απαγορευτικούς χρόνους.
Στην πράξη ο αριθμός των διαδρομών δεν είναι τόσο μεγάλος
Οι πόλεις δεν συνδέονται με όλες τις πόλεις ( ο αντίστοιχος γράφος είναι
αραιός)
Άρα ο ο πρώτος αλγόριθμος μπορεί να φθάσει σε αδιέξοδο και να πρέπει
να οπισθοχωρεί.
Κρίσιμος Δρόμος CPM (Critical Path Method)

• Αλγόριθμος CPM (Critical Path Method): βρίσκει τον κρίσιμο δρόμο σε ένα δίκτυο
δραστηριοτήτων.
• Σύνθετο έργο: αποτελείται από ένα σύνολο καλά καθορισμένων και μη
επικαλυπτόμενων εργασιών.
• Υπάρχουν περιορισμοί που υπαγορεύουν ποιες εργασίες πρέπει να έχουν
ολοκληρωθεί πριν αρχίσει η εκτέλεση κάποιων άλλων.
Κρίσιμος Δρόμος CPM (Critical Path Method)
Αναπαράσταση έργου: Με ένα δίκτυο που είναι μια διαφορετική ονομασία ενός
κατευθυνόμενου ζυγισμένου γράφου.
Τόξα του γράφου: συμβολίζουν τις επιμέρους εργασίες (δραστηριότητες),
Κορυφές (γεγονότα): την αρχή/τέλος των εργασιών.
Παράδειγμα: ένα τόξο (u, v) αναπαριστά μια εργασία που η εκτέλεσή της θα
μπορεί να αρχίσει μόνο όταν θα έχουν ολοκληρωθεί οι εργασίες που προσπίπτουν
στην κορυφή u.
Ο αλγόριθμος CPM
• Αρχικά: Υπολογίζει τους νωρίτερους (ΕΧ) και βραδύτερους χρόνους (ΒΧ) των
γεγονότων.
• Στη συνέχεια: Βρίσκει ποια γεγονότα βρίσκονται πάνω σε έναν κρίσιμο δρόμο.
• Κρίσιμος δρόμος: απαρτίζεται από γεγονότα (κορυφές) όπου συμπίπτει ο
νωρίτερος με τον βραδύτερο χρόνο.
• Έννοια: οι εργασίες που συνθέτουν ένα κρίσιμο δρόμο δεν μπορούν ούτε να
καθυστερήσουν ούτε να εκτελεστούν πιο γρήγορα.
Αλγόριθμος CPM ‘ Υπολογισμός ΒΧ
Δεδομένα // Α, Ν // ΒΧ(Ν) ← ΕΧ(Ν)
Για i από 1 μέχρι Ν Για i από Ν-1 μέχρι 1 με_βήμα -1
ΕΧ(i) ← 0 Για j από Ν μέχρι 2 με_βήμα -1
BΧ(i) ← 1000 Αν Α(i, j) ≠ 0 και ΒΧ(j) - A(i,j) <
Τέλος-επανάληψης ΒX(i) τότε
‘ Υπολογισμός ΕΧ ΒΧ(i) ← ΒX(j) - A(i,j)
Για i από 1 μέχρι Ν-1 Τέλος_αν
Για j από 2 μέχρι Ν Τέλος_επανάληψης
Τέλος_επανάληψης
Αν Α(i, j) ≠ 0 και ΕΧ(i) + A(i,j)
> EX(j) τότε ‘ Κρίσιμος δρόμος
ΕΧ(j) ← EX(i) + A(i,j) Για i από 1 μέχρι Ν
Τέλος_αν Αν ΕΧ(i) = BX(i) τότε
Τέλος_επανάληψης Εμφάνισε i
Τέλος_επανάληψης Τέλος_αν
Τέλος_επανάληψης
Τέλος CPM
ΠΑΡΑΔΕΙΓΜΑ:
• Ένα δίκτυο έργου όπου σε κάθε κόμβο αναγράφονται οι νωρίτεροι και
βραδύτεροι χρόνοι.
• Βάρη στα τόξα: ο κωδικός της εργασίας και η χρονική διάρκεια.
• Ο κρίσιμος δρόμος είναι ο 1, 3, 4, 6.
Δομές Δεδομένων
VII-2
Γράφοι- Ασκήσεις

Ελένη Γαλιώτου
ΓΡΑΦΟΙ
ΠΑΡΑΔΕΙΓΜΑΤΑ - ΑΣΚΗΣΕΙΣ
1. ΑΝΑΖΗΤΗΣΗ ΜΕ ΠΡΟΤΕΡΑΙΟΤΗΤΑ ΒΑΘΟΥΣ

Αναπαράσταση με λίστες γειτνίασης:


Ένας κόμβος που αντιστοιχεί σε κάθε ακμή ενός γράφου
Ένας δείκτης κεφαλής της λίστας που αντιστοιχεί σε κάθε κορυφή του γράφου
Επίσκεψη όλων των κόμβων που συνδέονται με τον κόμβο k ενός γράφου
Σημειώνουμε τον κόμβο ως κόμβο που έχουμε επισκεφθεί
Επισκεπτόμαστε (αναδρομικά) όλους τους κόμβους που δεν έχουμε επισκεφθεί
και περιλαμβάνονται στη λίστα γειτνίασης του k
ΑΝΑΖΗΤΗΣΗ ΜΕ ΠΡΟΤΕΡΑΙΟΤΗΤΑ ΒΑΘΟΥΣ (ΣΥΝΕΧΕΙΑ)

void traverse (int k, void (*visit) (int))


{ link t;
( *visit ) (k); visited [k] = 1;
for (t = adj [k]; t != NULL; t = t -> next)
if ( !visited [t ->v]) traverse (t-> v, visit) ;
ΑΝΑΠΑΡΑΣΤΑΣΗ ΓΡΑΦΟΥ ΜΕ ΛΙΣΤΑ ΓΕΙΤΝΙΑΣΗΣ
ΚΛΗΣΕΙΣ ΜΕΘΟΔΟΥ
ΑΝΑΖΗΤΗΣΗΣ ΜΕ
ΠΡΟΤΕΡΑΙΟΤΗΤΑ
ΒΑΘΟΥΣ
2. ΑΝΑΖΗΤΗΣΗ ΜΕ ΠΡΟΤΕΡΑΙΟΤΗΤΑ ΕΥΡΟΥΣ
Επίσκεψη όλων των κόμβων που συνδέονται με τον κόμβο k ενός γράφου
Τοποθετούμε τον k σε μία ουρά FIFO
Μπαίνουμε σε ένα βρόχο
κατά τη διάρκεια του οποίου παίρνουμε τον επόμενο κόμβο από την
ουρά
Αν δεν τον έχουμε επισκεφθεί ήδη,
τον επισκεπτόμαστε
Ωθούμε στην ουρά όλους τους κόμβους που ανήκουν στη λίστα
γειτνίασης αυτού του κόμβου
Συνεχίζουμε τη διαδικασία μέχρι να αδειάσει η ουρά
ΑΝΑΖΗΤΗΣΗ ΜΕ ΠΡΟΤΕΡΑΙΟΤΗΤΑ ΕΥΡΟΥΣ (ΣΥΝΕΧΕΙΑ)
3. ΑΝΑΖΗΤΗΣΗ ΜΕ ΠΡΟΤΕΡΑΙΤΗΤΑ
ΒΑΘΟΥΣ (ΧΡΗΣΗ ΣΤΟΙΒΑΣ)
Να υλοποιήσετε μία αναζήτηση με προτεραιότητα βάθους που να βασίζεται σε
στοίβα για γράφους οι οποίοι αναπαρίστανται με λίστες γειτνίασης
typedef int Item; int visited[N];
link *adj;
else
typedef struct node *link; void traverse(int k, void (*visit) (int)) {
struct node { (*visit)(t->v);
{ link t; visited[t->v] = 1;
int v; STACKinit(N); STACKpush(t->v);
link next; STACKpush(k);
t = adj[t->v];
(*visit)(k);
}; visited[k] = 1; }
link new(int, link); while (!STACKempty()) }
{ k = adj[STACKpop()]->v;
void STACKinit(int); t = adj[k]; }
while (t != NULL)
int STACKempty(void); }
{
void STACKpush(Item); if (visited[t->v])
Item STACKpop(void); t = t -> next;
4. ΑΝΑΔΡΟΜΙΚΗ ΑΝΑΖΗΤΗΣΗ ΜΕ
ΠΡΟΤΕΡΑΙΟΤΗΤΑ ΒΑΘΟΥΣ

Να υλοποιήσετε μία αναδρομική αναζήτηση με προτεραιότητα βάθους για


γράφους που αναπαρίστανται με λίστες γειτνίασης
typedef struct node void traverse(int k, void (*visit) (int))
*link; {
struct node link t;
{
int v; (*visit)(k);
link next; visited[k] = 1;
}; for (t = adj[k]; t != NULL; t = t->next)
link new(int, link); {
if (!visited[t->v])
traverse(t->v, visit);
int visited[N]; }
link *adj; }

You might also like