Εργαστήριο 10 Γράφηµα (Graph) Εισαγωγή Στην πληροφορική γράφηµα ονοµάζεται µια δοµή δεδοµένων, που αποτελείται από ένα σύνολο κορυφών ( vertices) (ή κόµβων ( nodes» και ένα σύνολο ακµών ( edges). Ενας επίσηµος ορισµός είναι ο ακόλουθος : Ορισµός 10.1. Εστω το µη κενό και πεπερασµένο σύνολο V µε n διακεκριµένα στοιχεία V = {v 1,...,v n }, και E ένα σύνολο µε m 0 µη διατεταγµένα Ϲεύγη e ij = {v i,v j }, i j, στοιχείων του V. Τότε το διατεταγµένο Ϲεύγος G = (V, E) ονοµάζεται µη κατευθυνόµενο γράφηµα ( undirected graph) ή απλώς γράφηµα. Κάθε στοιχείο v i του V είναι µία κορυφή και κάθε στοιχείο e ij του E είναι µία ακµή. Παρατηρούµε ότι για m = 0 το σύνολο E των ακµών είναι κενό, δηλαδή ένα γράφηµα µπορεί να αποτελείται µόνο από κορυφές. Τάξη ( order) ενός γραφήµατος ονοµάζουµε το πλήθος των κορυφών του (δηλαδή το n), ενώ µέγεθος ( size) ονοµάζουµε το πλήθος των ακµών του (δηλαδή το m). Ενα γράφηµα µπορεί να παρασταθεί γεωµετρικά µε ένα διάγραµµα, και υπάρχουν άπειροι τρόποι να απεικονιστεί, αλλάζοντας απλά την ϑέση των κορυφών στο επίπεδο. Μία περίπτωση Σχήµα 10.1: Παράδειγµα απεικόνισης του γραφήµατος G(V, E) µε V = {α, β, γ, δ, ǫ} και E = {{α, β}, {α, ǫ}, {β, γ}, {β, ǫ}, {γ, δ}, {δ,ǫ}} ϕαίνεται στο σχή- µα 10.1. ύο κορυφές v i,v j ονοµάζονται διπλανές (adjacent) όταν υπάρχει ακµή e ij = {v i,v j } που να τις έχει άκρα. ύο κορυφές που δεν είναι γραφήµατος διπλανές ονοµάζονται ανεξάρτητες ( independent). Ετσι στο σχήµα 10.1 η κορυφές α και ǫ είναι διπλανές ενώ οι β και δ ανεξάρτητες. Βαθµό ( degree) µιας κορυφής ονοµάζουµε το πλήθος των διπλανών κορυφών της, ή αλλιώς το πλήθος των ακµών που πρόσκεινται στην κορυφή. Ετσι στο ίδιο σχήµα 10.1 ο ϐαθµός της κορυφής α είναι 2, και γράφεται deg(α) = 2, ενώ της β είναι 3. Μια κορυφή ονοµάζεται άρτια ή περιττή ανάλογα µε το αν ο ϐαθµός της είναι άρτιος ή περιττός. Μία κορυφή v i µε ϐαθµό deg(v i ) = 0 ονοµάζεται µεµονωµένη (isolated), ενώ αν deg(v i ) = 1 η v i ονοµάζεται τελική κορυφή (end vertex). Εάν ένα γράφηµα περιλαµβάνει όλους τους δυνατούς συνδυασµούς ακµών ανάµεσα στις κορυφές του, τότε ονοµάζεται πλήρες γράφηµα (complete graph). Στην συνέχεια δίνουµε ορισµένους περαιτέρω ορισµούς γύρω από την έννοια του γραφήµατος. Ενα γράφηµα U είναι υπογράφηµα ( subgraph) ενός γραφήµατος G, όταν όλες οι κορυφές και ακµές του είναι κορυφές και ακµές του G. Το G ονοµάζεται υπεργράφος (supergraph) του U. 46
Σχήµα 10.2: κορυφής γ ιαγραφή της Η πράξη της διαγραφής ενός γνήσιου υποσυνόλου S του συνόλου των κορυφών V ενός γραφήµατος G(V, E) παράγει ένα υπογράφη- µα, που περιέχει τις κορυφές του G, οι οποίες δεν ανοίκουν στο S και τις ακµές του G, οι οποίες δεν έχουν ως άκρα καµµία από τις διαγραµµένες κορυφές. Ετσι, αν από το γράφηµα του σχήµατος 10.1 διαγράψουµε το υποσύνολο S = {γ} ϑα πάρουµε το γράφηµα του σχήµατος 10.2. Η πράξη της διαγραφής µπορεί να εφαρµοστεί και για τις ακ- µές ενός γραφήµατος. Η διαγραφή ενός γνήσιου υποσυνόλου P του συνόλου E των ακµών ενός γραφήµατος V (V, E) παράγει ένα υπογράφηµα του V, που περιέχει όλες τις κορυφές του V και όλες τις ακµές που δεν ανοίκουν στο P. Παίρνοντας πάλι ως παράδειγµα το γράφηµα του σχήµατος 10.1, µε διαγραφή του υποσυνόλου P = {{β, γ}} από το E παίρνουµε το υπογράφηµα του σχήµατος 10.3. Παρατηρούµε, λοιπόν, ότι η πράξη της διαγραφής κορυφών από γράφηµα, εκτός από τις κορυφές αποµακρύνει και τις προσκείµενες ακµές, ενώ αντίθετα η διαγραφή ακµών αφήνει τις κορυφές ανέπαφες, ακόµα κι αν κάποιες µετατρέπονται µ αυτόν τον τρόπο σε µεµονωµένες. Αντιστρόφως, µπορούµε να εφαρµόσουµε την πράξη της προσθήκης κορυφών ή ακµών σε έναν γράφηµα, µε το γράφηµα που προκύπτει να είναι υπεργράφηµα του αρχικού. Ετσι µε την προσθήκη της ακµής {β, γ} στο γράφηµα του σχήµατος 10.3 παίρνουµε τον γράφο του σχήµατος 10.1. Οι ακόλουθες έννοιες αναφέρονται στην δοµή ενός γραφήµατος. Ονοµάζουµε περίπατο ( walk) σε έναν γράφηµα G µία ακολουθία κο- ϱυφών του γραφήµατος, της µορφής W = v 0,v 1,v 2,...,v n και λέµε ότι έχει µήκος n. Για παράδειγµα, ο περίπατος W 1 = α, ǫ,δ στο γράφηµα του σχήµατος 10.3 έχει µήκος 3. Ενας περίπατος ονοµάζεται µονοπάτι ( path) όταν καµµία κορυφή δεν επαναλαµβάνεται. Ετσι ο περίπατος W 1 είναι και µονοπάτι. Απόσταση ( distance) µεταξύ δύο κορυφών ονοµάζουµε το µήκος του συντοµότερου δυνατού µονοπατιού που συνδέει τις κορυφές αυτές. Στο προηγούµενο παράδειγµα το µήκος του W 1 είναι και Σχήµα 10.3: ιαγραφή της η απόσταση µεταξύ των κορυφών α και δ. Κύκλος (cycle) είναι ένας περίπατος v 0,v 1,v 2,...,v n για τον οποίο ισχύουν n 3, v 0 = v n και v i v j, i j, i, j = 1,...,n. Ο περίπατος W 2 = α, ǫ, β,α είναι ένας κύκλος. Μία κορυφή x ενός ακµής ϐ,γ γραφήµατος G ονοµάζεται συνδεδεµένη µε µία άλλη κορυφή y, όταν το G περιέχει ένα τουλάχιστον µονοπάτι από την κορυφή x στην κορυφή y. Κατευθυνόµενα γραφήµατα Υπάρχουν περιπτώσεις δικτύων που δεν µπορούν να µοντελοποιηθούν ως απλά γραφήµατα, π.χ. οι δρόµοι ενός οδικού δικτύου δεν µπορούν να παρασταθούν επαρκώς ως κορυφές ενός γραφήµατος. Σε τέτοιες περιπτώσεις µπορούν να χρησιµοποιηθούν τα κατευθυνόµενα γραφήµατα ( directed graphs), τα οποίοι διαφέρουν στο ότι οι ακµές τους είναι διατεταγµένα Ϲεύγη αντί για απλά διµελή σύνολα. Ενας ορισµός είναι ο ακόλουθος : Ορισµός 10.2. Ενα κατευθυνόµενο γράφηµα D(V, A) αποτελείται από ένα πεπερασµένο µη κενό σύνολο κορυφών V και ένα σύνολο A διατεταγµένων Ϲευγών (x,y), x, y V, που ονοµάζονται τόξα (arcs). 47
Μία απεικόνιση του κατευθυνόµενου γράφήµατος D(V, A) µε V = {α,β, γ, δ,ǫ} και A = {(α, β), (β, γ), (δ,α), (δ,γ), (ǫ, α), (ǫ, β), (ǫ, δ)} ϕαίνεται στο σχήµα 10.4. Αν (x, y) είναι ένα τόξο ενός κατευθυνόµενου γραφήµατος, τότε ονοµάζουµε το x αρχή του τόξου και το y πέρας ή τέλος του τόξου. Το πλήθος των τόξων που εχουν µία κορυφή v ως αρχή ονοµάζεται έξω ϐαθµός (out degree) της κορυφής και συµβολίζεται µε deg + (v). Το πλήθος των τόξων που έχουν µία κορυφή ώς πέρας ονοµάζεται έσω ϐαθµός (in degree) της κορυφής και συµβολίζεται µε deg (v). Ο ϐαθµός µιας κορυφής ενός κατευθυνόµενου γραφήµατος συµβολίζεται πάλι µε deg(v) και ισούται µε το άθροισµα των έσω και έξω ϐαθµών : deg(v) = deg + (v)+deg (v). Ετσι στο κατευθυνόµενο γράφηµα του Σχήµα 10.4: Κατευθυνόµενο σχήµατος 10.4 για την κορυφή α ισχύει deg(α) = 3, µε deg + (α) = 1 γράφηµα και deg (α) = 2. Μία κορυφή v ενός κατευθυνόµενου γραφήµατος ονοµάζεται πηγή (source) όταν ισχύει deg (v) = 0, και αποδέκτης (sink) όταν deg + (v) = 0. Τέλος, ένα µη κατευθυνόµενο γράφηµα είναι µία ειδική περίπτωση κατευθυνόµενου γραφήµατος, καθώς κάθε ακµή e = {x,y} του µη κατευθυνόµενου γραφήµατος µπορεί να απεικονιστεί µε δύο τόξα a 1 = (x,y) και a 2 = (y, x). Γραφήµατα µε ϐάρη Πολλές εφαρµογές της ϑεωρίας γραφηµάτων απαιτούν την αντιστοίχιση ενός ϐάρους ( weight) σε κάθε κορυφή ή ακµή του γραφήµατος. Στην περίπτωση αυτή µιλάµε για γράφηµα µε ϐάρη ( weighted graph). Ανάλογα µε το είδος της εφαρµογής το ϐάρος µπορεί να είναι κόστος, χωρητικότητα, απόσταση κ.λπ. Οταν τα ϐάρη αποδίδονται στις κορυφές του γραφήµατος (κατευθυνόµενου ή µη) µιλάµε για γράφηµα µε ϐάρη στις κορυφές ( vertex weighted graph), ενώ όταν αποδίδονται στις ακµές (ή στα τόξα ενός κατευθυνόµενου γραφήµατος) µιλάµε για γράφηµα µε ϐάρη στις ακµές ( edge weighted graph) (ή κατευθυνόµενο γράφηµα µε ϐάρη στα τόξα ( arc weighted directed graph)). Ενα κατευθυνόµενο γράφηµα µε ϐάρη στα τόξα µερικές ϕορές καλείται δίκτυο ( network). Κατασκευή γραφηµάτων στον υπολογιστή Τα γραφήµατα µπορούν να κατασκευαστούν υπολογιστικά µε δύο ϐασικούς τρόπους : Με χρήση µήτρας γειτνίασης ( adjacency matrix) ή Σχήµα 10.5: Απεικόνιση γραφήµατος µε µήτρα και λίστα γειτνίασης 48
Με χρήση λίστας γειτνίασης ( adjacency list). Η µήτρα γειτνίασης ενός γραφήµατος G(V,E) µπορεί να κατασκευαστεί µε έναν πίνακα A n n, όπου n η τάξη του γρφήµατος και όπου : { 1 αν (v i,v j ) E A[i,j] = 0 διαφορετικά Η λίστα γειτνίασης ενός γραφήµατος G κατασκευάζεται δηµιουργώντας µία λίστα για κάθε κορυφή του γραφήµατος, που περιέχει όλες τις διπλανές σε αυτήν κορυφές. Ετσι, το γράφηµα του σχήµατος 10.1 µπορεί να απεικονιστεί µε µήτρα και λίστα όπως ϕαίνεται στο σχήµα 10.5. Ασκηση 10.1 Κατασκευάστε ένα κατευθυνόµενο γράφηµα δηµιουργώντας τις παρακάτω κλάσεις : GraphVertex class, η οποία περιγράφει µία κορυφή ενός γραφήµατος, GraphArc class, η οποία περιγράφει ένα τόξο και SimpleDirectedGraph class, που υλοποιεί το DirectedGraph interface Graph.java public interface Graph extends DataStructure { <p> Inserts a vertex in the graph public void addvertex ( Object vertex ) ; <p> Deletes a vertex from the graph together with a l l connected arcs public boolean deletevertex ( Object vertex ) ; <p> Returns the number of vertices in the graph public int order ( ) ; <p> Returns the number of arcs or edges in the graph 49
public int graphsize ( ) ; <p> Returns the number of arcs or edges connected to the given vertex public int degreeof ( Object vertex ) ; <p> Returns true i f the given vertex e x i s t s in the graph public boolean isvertex ( Object vertex ) ; } DirectedGraph.java public interface DirectedGraph extends Graph { <p> Inserts an arc in the graph by specifying i t s start and end vertices public void addarc ( Object startvertex, Object endvertex ) ; <p> Deletes an arc from the graph public boolean deletearc ( Object startvertex, Object endvertex ) ; <p> Deletes a l l arcs starting from the given vertex @return boolean public boolean deleteallarcsfrom ( Object vertex ) ; 50
<p> Deletes a l l arcs pointing to the given vertex @return boolean public boolean deleteallarcsto ( Object vertex ) ; <p> Returns the number of arcs s t a r t i n g from the given vertex public int outdegreeof ( Object vertex ) ; <p> Returns the number of arcs ending at the given vertex public int indegreeof ( Object vertex ) ; <p> Returns true i f the given ordered pair ( st a rt, end ) constitues an existing arc in the graph public boolean isarc ( Object startvertex, Object endvertex ) ; <p> Returns the undirected version of t h i s graph @return UndirectedGraph public UndirectedGraph toundirected ( ) ; } Ασκηση 10.2 Κατασκευάστε ένα µη κατευθυνόµενο γράφηµα δηµιουργώντας την παρακάτω κλάση : SimpleUndirectedGraph class, που υλοποιεί το UndirectedGraph interface 51