Σχεδίαση και Ανάλυση Αλγορίθμων: Εργαστήριο 3 ο Βασικοί Τύποι Δεδομένων στη LEDA Τοπολογική διάταξη. Τοπολογική Ταξινόμηση Στοιχείων

Σχετικά έγγραφα
Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

ΘΕΜΑ Α ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

Μέγιστη ροή. Κατευθυνόμενο γράφημα. Συνάρτηση χωρητικότητας. αφετηρίακός κόμβος. τερματικός κόμβος. Ροή δικτύου. με τις ακόλουθες ιδιότητες

Ενδεικτικές Ερωτήσεις Θεωρίας

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 8 Ο. Ταξινόμηση και Αναζήτηση Συναρτήσεις χειρισμού οθόνης ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

HY Λογική Διδάσκων: Δ. Πλεξουσάκης Εαρινό Εξάμηνο. Φροντιστήριο 6

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός

2 ΟΥ και 8 ΟΥ ΚΕΦΑΛΑΙΟΥ

ΣΥΝΕΚΤΙΚΟΤΗΤΑ ΓΡΑΦΗΜΑΤΩΝ

Να το ξαναγράψετε χρησιμοποιώντας αντί για την εντολή Για Τέλος_επανάληψης: α. την εντολή Όσο Τέλος_επανάληψης

Βασικές έννοιες προγραμματισμού

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ Τελικό επαναληπτικό διαγώνισμα Επιμέλεια: Δρεμούσης Παντελής

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Δρομολόγηση Και Πολύχρωματισμός. Γραφημάτων ΚΑΡΑΓΕΩΡΓΟΣ ΤΙΜΟΘΕΟΣ Α.Μ 1026

Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ )

u v 4 w G 2 G 1 u v w x y z 4

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Τομές Γραφήματος. Γράφημα (μη κατευθυνόμενο) Συνάρτηση βάρους ακμών. Τομή : Διαμέριση του συνόλου των κόμβων σε δύο μη κενά σύνολα

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

FAIL PASS PASS οριακά

1. Πότε χρησιμοποιούμε την δομή επανάληψης; Ποιες είναι οι διάφορες εντολές (μορφές) της;

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. 1 ο ΚΕΦΑΛΑΙΟ

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Εντολές της LOGO (MicroWorlds Pro)

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

Τυχαιοκρατικοί Αλγόριθμοι

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2. Α1. Ο αλγόριθμος είναι απαραίτητος μόνο για την επίλυση προβλημάτων πληροφορικής

ΤΕΛΙΚΟ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΣΠΟΥΔΩΝ ΟΙΚΟΝΟΜΙΑΣ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

Επαναληπτικές Διαδικασίες

1. Δεν μπορεί να γίνει κλήση μίας διαδικασίας μέσα από μία συνάρτηση.

ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ ΤΡΙΤΗ 11 ΙΟΥΝΙΟΥ 2019 ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ

Κεφάλαια Εντολές επανάληψης. Τρεις εντολές επανάληψης. Επιλογή εντολής επανάληψης ΟΣΟ...ΕΠΑΝΑΛΑΒΕ. Σύνταξη στη ΓΛΩΣΣΑ

ΜΑΘΗΜΑ / ΤΑΞΗ : ΑΕΠΠ / Γ ΛΥΚΕΙΟΥ-ΘΕΡΙΝΑ ΣΕΙΡΑ: 1 η ΗΜΕΡΟΜΗΝΙΑ: 09/09/2012

Ψευδοκώδικας. November 7, 2011

Εισαγωγή στους Αλγορίθμους

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Αναφορά (1/2) Μπορούμε να ορίσουμε μια άλλη, ισοδύναμη αλλά ίσως πιο σύντομη, ονομασία για ποσότητα (μεταβλητή, σταθερή, συνάρτηση, κλπ.

A. Να γράψετε τον αριθμό της κάθε μιας από τις παρακάτω προτάσεις και δίπλα. το γράμμα Σ, εάν είναι σωστή, ή το γράμμα Λ, εάν είναι λανθασμένη.

ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ Γ ΗΜΕΡΗΣΙΩΝ

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. Εξετάσεις Προσομοίωσης 24/04/2019

ΔΟΜΗ ΕΠΙΛΟΓΗΣ. Οι διάφορες εκδοχές της

ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ Γ ΗΜΕΡΗΣΙΩΝ

Κατευθυνόµενα γραφήµατα. Στοιχεία Θεωρίας Γραφηµάτων (1) Πολυγραφήµατα (Multigraphs)

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Μεταγλωττιστές. Γιώργος Δημητρίου. Μάθημα 9 ο

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 3 ο. Πίνακες. Επικοινωνία:

Πρόβλημα 37 / σελίδα 207

Φυσικές και τεχνητές γλώσσες. Το αλφάβητο της ΓΛΩΣΣΑΣ, Τύποι Δεδομένων. Σταθερές, Μεταβλητές, Τελεστές, Συναρτήσεις, Δομή Προγράμματος

Επαναληπτικές Ασκήσεις. Ρίζου Ζωή

Βρόχοι. Εντολή επανάληψης. Το άθροισμα των αριθμών 1 5 υπολογίζεται με την εντολή. Πρόβλημα. Πώς θα υπολογίσουμε το άθροισμα των ακέραιων ;

ΑΣΚΗΣΗ 1 Για τις ερωτήσεις 1-4 θεωρήσατε τον ακόλουθο γράφο. Ποιές από τις παρακάτω προτάσεις αληθεύουν και ποιές όχι;

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος.

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο Δεύτερη Προγραμματιστική Εργασία

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

ΑΡΧΗ 1ης ΣΕΛΙΔΑΣ ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ : ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΤΑΞΗ / ΤΜΗΜΑ : Γ ΛΥΚΕΙΟΥ ΔΙΑΓΩΝΙΣΜΑ ΠΕΡΙΟΔΟΥ : ΑΠΡΙΛΙΟΣ 2019 ΣΥΝΟΛΟ ΣΕΛΙΔΩΝ : 7 (ΕΠΤΑ)

Επαναληπτική δοκιμασία στην Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον Τεχνολογικής Κατεύθυνσης Μάιος 2013

ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ. Κάθε υποπρόγραμμα έχει μόνο μία είσοδο και μία έξοδο. Κάθε υποπρόγραμμα πρέπει να είναι ανεξάρτητο από τα άλλα.

1 Διάσχιση κατευθυνόμενων γραφημάτων

Κατευθυνόμενα γραφήματα. Μαθηματικά Πληροφορικής 6ο Μάθημα. Βρόχοι. Μη κατευθυνόμενα γραφήματα. Ορισμός

Στοιχεία Θεωρίας Γραφηµάτων (1)

ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ Δ ΕΣΠΕΡΙΝΩΝ

Κατευθυνόμενα γραφήματα. Μαθηματικά Πληροφορικής 6ο Μάθημα. Βρόχοι. Μη κατευθυνόμενα γραφήματα. Ορισμός

! ΘΕΜΑ A Α2. ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΛΥΚΕΙΟΥ. Ονοµατεπώνυµο:

Δομές Δεδομένων. Ενότητα 2: Στοίβες Εισαγωγή-Υλοποίηση ΑΤΔ Στοίβα με Πίνακα-Εφαρμογή Στοίβας: Αντίστροφη Πολωνική Γραφή. Καθηγήτρια Μαρία Σατρατζέμη

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2

ΟΜΟΣΠΟΝΔΙΑ ΕΚΠΑΙΔΕΥΤΙΚΩΝ ΦΡΟΝΤΙΣΤΩΝ ΕΛΛΑΔΟΣ (Ο.Ε.Φ.Ε.) ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ ΕΠΑΝΑΛΗΠΤΙΚΑ ΘΕΜΑΤΑ 2019 Β ΦΑΣΗ Γ ΓΕΝΙΚΟΥ ΛΥΚΕΙΟΥ

Θεωρία Γραφημάτων 6η Διάλεξη

ΘΕΜΑ 1 ο. β) 1. δυαδική 2. κατανόηση 3. τυπικοί 4. τεχνητής νοημοσύνης 5. ακέραιου

Επαναληπτικό διαγώνισμα στην Α.Ε.Π.Π - 18 / Απριλίου / 2010 ΘΕΜΑ 1


ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 3 ο

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΛΓΟΡΙΘΜΩΝ ΒΟΗΘΟΣ: ΒΑΓΓΕΛΗΣ ΔΟΥΡΟΣ

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΦΡΟΝΤΙΣΤΗΡΙΟ ΑΛΓΟΡΙΘΜΩΝ ΒΟΗΘΟΣ: ΒΑΓΓΕΛΗΣ ΔΟΥΡΟΣ

ΑΡΧΗ 2ΗΣ ΣΕΛΙΔΑΣ Γ Α... Β

Ανάπτυξη Εφαρμογών σε Προγραμματιστικό Περιβάλλον. Εκχώρηση Τιμών

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΕΠΑΝΑΛΗΠΤΙΚΟ ΔΙΑΓΩΝΙΣΜΑ ΣΧΟΛΙΚΟΥ ΕΤΟΥΣ

Λογικός τύπος Τελεστές σύγκρισης Λογικοί τελεστές Εντολές επιλογής Εμβέλεια Μαθηματικές συναρτήσεις Μιγαδικός τύπος ΔΕΥΤΕΡΗ ΔΙΑΛΕΞΗ

Επιλέξτε Σωστό ή Λάθος για καθένα από τα παρακάτω:

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Γραφήματα. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Πρόβλημα 29 / σελίδα 28

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 2 Εντολές Εισόδου/Εξόδου Τελεστές. Δρ. Γιώργος Λαμπρινίδης 23/10/2015 Η - Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 1

Βάσεις Δεδομένων 2. Φροντιστήριο Δοσοληψίες Τεχνικές ελέγχου συνδρομικότητας. Ημερ: 05/5/2009 Ακ.Έτος

Φροντιστήρια Επίγνωση Προτεινόμενα Θέματα Πανελλαδικών ΑΕΠΠ 2015

Πληροφορική 2. Αλγόριθμοι

Λίστες στο Scratch 2.0.

Προτεινόμενα Θέματα ΑΕΠΠ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ Τ Μ Η Μ Α Π Λ Η Ρ Ο Φ Ο Ρ Ι Κ Η Σ

Transcript:

Σχεδίαση και Ανάλυση Αλγορίθμων: Εργαστήριο 3 ο Βασικοί Τύποι Δεδομένων στη LEDA Τοπολογική διάταξη Τοπολογική Ταξινόμηση Στοιχείων Έστω ότι μας δίνεται μια διμελής σχέση (έστω ότι απεικονίζεται με τη μορφή λίστας) L VxV από διατεταγμένα ζεύγη (ακέραιων) αριθμών από το σύνολο V={1,,N}. Tα ζεύγη αυτά μπορούν για παράδειγμα να απεικονίζουν τις (κατευθυνόμενες) ακμές μεταξύ των κορυφών ενός γραφήματος. Στόχος μας σε αυτό το εργαστήριο είναι να διαπιστώσουμε αν υπάρχει μια διάταξη για το σύνολο των στοιχείων του V (δηλαδή, τοποθέτησή τους πάνω στην ευθεία γραμμή), τέτοια ώστε για κάθε ζεύγος (α,β) που είναι αποθηκευμένο στην L, το πρώτο στοιχείο του ζεύγους αυτού (το α) να εμφανίζεται στη διάταξή των κορυφών μας ΠΡΙΝ από το δεύτερο στοιχείο (το β) του ζεύγους. Μια τέτοια διάταξη ονομάζεται τοπολογική διάταξη των στοιχείων του V, ως προς τη δυαδική σχέση που ορίζουν τα ζεύγη που είναι αποθηκευμένα στην L. Το πρόβλημα της εύρεσης (αν υπάρχει, ή διαφορετικά της διαπίστωσης μη ύπαρξης) μιας τοπολογικής διάταξης των στοιχείων του V έτσι ώστε όλα τα διατεταγμένα ζεύγη στοιχείων του L να έχουν το πρώτο στοιχείο πριν από το δεύτερο στοιχείο στη διάταξη, ονομάζεται πρόβλημα της Τοπολογικής Ταξινόμησης των στοιχείων του V ως προς τη διμελή σχέση L VxV. Για παράδειγμα, αν τα ζεύγη του L απεικονίζουν τις (κατευθυνόμενες) ακμές μεταξύ των κορυφών ενός γραφήματος Γ, τότε αυτό που θέλουμε να διαπιστώσουμε είναι αν υπάρχει τρόπος να τοποθετήσουμε όλες τις κορυφές του Γ πάνω σε μια ευθεία με τέτοιο τρόπο ώστε όλες οι (κατευθυνόμενες) ακμές του να έχουν κατεύθυνση από «αριστερά» προς τα «δεξιά». Ένα παράδειγμα γραφήματος που έχει τοπολογική διάταξη φαίνεται στο ακόλουθο σχήμα:

Παρατηρείστε ότι αν πχ προσθέταμε την ακμή (1,10) δε θα υπήρχε τοπολογική διάταξη για το γράφημα, γιατί τότε το γράφημα θα είχε κύκλο <10,2,1,10>, και συνεπώς δε μπορεί να έχει τοπολογική διάταξη αφού από τη μια ζητείται το 1 να έπεται του 10 και από την άλλη να προηγείται αυτού. Το πρόβλημα της Τοπολογικής Ταξινόμησης εμφανίζεται για παράδειγμα στη δρομολόγηση διεργασιών που έχουν εξαρτήσεις προτεραιότητας εκτέλεσης (precedence constraints), σε μια μηχανή: Αν έχουμε να εκτελέσουμε ένα σύνολο από διεργασίες, με την προϋπόθεση ότι κάποιες από αυτές προηγούνται (στην εκτέλεσή τους) κάποιων άλλων, τότε αυτοί οι περιορισμοί ορίζουν ένα κατευθυνόμενο γράφημα. Οποιαδήποτε τοπολογική διάταξη του γραφήματος αυτού (εφόσον υπάρχει) μας υποδεικνύει ένα τρόπο εκτέλεσης των λειτουργιών αυτών, έτσι ώστε καμιά διεργασία να μην εκτελείται πριν από εκείνες που πρέπει να προηγούνται από αυτήν. Ο αλγόριθμος για την εύρεση τοπολογικής διάταξης (ή διαπίστωση μη ύπαρξης) Ένας απλός αλγόριθμος για την ανίχνευση της ύπαρξης (και κατασκευή) μιας τοπολογικής διάταξης είναι ο εξής: [1] Διαβάζουμε όλες τις ακμές (ζεύγη ακεραίων) που μας δίνει ο χρήστης /* Χρησιμοποιείστε μια λίστα L της LEDA και την εντολή L.read() για να διαβάσετε τα δεδομένα της από το χρήστη. Η λίστα αυτή αποθηκεύει τα ζεύγη ακεραίων, που μπορούν να αναπαρασταθούν ως μεταβλητές τύπου two_tuple<int,int> της LEDA. */ [2] Αρχικοποιούμε ένα πίνακα INDEG N στοιχείων (όσα και τα στοιχεία του V) που μας υποδεικνύει, για κάθε κορυφή ν, τον αριθμό των κορυφών που προηγούνται αυτής (δηλαδή, τον αριθμό των ζευγών της μορφής (*,ν) στην L). /* Μέσω ενός βρόχου ενημερώνουμε μια λίστα κορυφών Ο που εμφανίζει τις κορυφές σύμφωνα με την τοπολογική τους διάταξη */ [3] ΕΝΟΣΩ υπάρχουν κορυφές που δεν έχουν μπει στη λίστα διατεταγμένων κορυφών ΟUT, ΕΚΤΕΛΕΣΕ [4] Διάλεξε μια οποιαδήποτε κορυφή ν με IΝDEG[ν] == 0 /* Αν δεν υπάρχει, τότε δεν υπάρχει και τοπολογική διάταξη. */ [5] Τοποθέτησε την κορυφή ν ως επόμενη (τελευταία) της λίστας OUT, και σημείωσε στον πίνακα IΝDEG ότι ήδη η κορυφή αυτή ήδη τοποθετήθηκε στην ΟUT (πχ, κάνε το μετρητή της -1). [6] Διάγραψε από την L όλες τις ακμές της μορφής (ν,κ) και μείωσε αντίστοιχα το μετρητή INDEG[κ] κατά 1 (για κάθε ακμή που αφαιρείται). [7] ΤΕΛΟΣ ΒΡΟΧΟΥ

[8] Τύπωσε τη λίστα διάταξης ΟUT των κορυφών ή μήνυμα ότι δεν υπάρχει τοπολογική διάταξη για το συγκεκριμένο στιγμιότυπο (και έναν κύκλο που το αποδεικνύει?). Ξεκινάμε δηλαδή θεωρώντας μια οποιαδήποτε κορυφή της οποίας καμία άλλη κορυφή ΔΕΝ ΠΡΟΗΓΕΙΤΑΙ (άρα η συγκεκριμένη κορυφή ΔΕΝ εμφανίζεται ως δεύτερη στη τρέχουσα λίστα των ακμών μας)! Μια τέτοια κορυφή μπορεί κάλλιστα να είναι η πρώτη κορυφή που παρουσιάζουμε στη διάταξή μας. Στη συνέχεια προσθέτουμε τη συγκεκριμένη κορυφή στο τέλος της λίστας ΟUT που παρουσιάζει την τοπολογική διάταξη, και αφαιρούμε από την L όλες τις ακμές από αυτήν προς άλλες κορυφές (ενημερώνοντας παράλληλα και τους μετρητές των εισερχόμενων ακμών για τις κορυφές). Επαναλαμβάνουμε τη διαδικασία μέχρι να τοποθετήσουμε όλες τις κορυφές στη λίστα ΟUT. Αν κάποια στιγμή στο βρόχο δεν υπάρχει κορυφή ν με μετρητή INDEG[ν]==0 (ώστε να συνεχίσουμε την αφαίρεση κορυφών) τότε δε μπορεί να υπάρχει τοπολογική διάταξη (στην πραγματικότητα ανιχνεύσαμε κάποιο κατευθυνόμενο κύκλο). Ας δούμε ένα παράδειγμα εκτέλεσης του αλγορίθμου, όπου τα ζεύγη κορυφών αντιστοιχούν στις ακμές του ακόλουθου γραφήματος: Ο πίνακας Ν που πρέπει να κατασκευάσουμε θα αρχικοποιηθεί ως εξής: Όνομα Κορυφής Αριθμός Εισερχόμενων Ακμών 1 0 2 1 3 1 4 1 5 2 6 2 7 1 8 2 9 0 Ο αλγόριθμος θα εκτελέσει το βρόχο 9 φορές (όσες και οι κορυφές). Στο σχήμα φαίνονται σε κάθε βήμα η λίστα L (μέσω των ακμών που δεν έχουν αφαιρεθεί ακόμα) και η λίστα ΟUT (μέσω των κορυφών που έχουν συμπεριληφθεί ήδη σε αυτήν). Αρχικά η L αντιστοιχεί στο γράφημα που δίνει ο χρήστης και η ΟUT είναι κενή:

Ο τύπος δεδομένων Λίστα (list) της LEDA Για να χρησιμοποιήσουμε τις λίστες της LEDA θα πρέπει να δηλώσουμε το header file (LEDA/list.h). Η δήλωση μιας μεταβλητής τύπου (LEDA) λίστας γίνεται ως εξής: list <E> L; //Δηλώνει μια μεταβλητή τύπου «Λίστα» της LEDA και την αρχικοποιεί στην κενή λίστα... Μια λίστα της LEDA είναι μια (διπλοσυνδεδεμένη) ακολουθία αντικειμένων (ενός προκαθορισμένου τύπου list_item), καθένα από τα οποία αποθηκεύει ως πληροφορία ένα στοιχείο x τύπου Ε. Ένα παράδειγμα φαίνεται στο ακόλουθο σχήμα: Η λίστα αυτή αποτελείται από πέντε αντικείμενα (μεταβλητές τύπου list_item) που περιέχουν (ως πληροφορία) τους ακέραιους αριθμούς 5, 3, 1, 5 και 2.

Μερικές χρήσιμες λειτουργίες σε λίστες Λειτουργίες Προσπέλασης L.empty(); // ελέγχει αν η λίστα μας είναι κενή E x = L.head(); // αναθέτει το περιεχόμενο (δηλαδή την τιμή της φυλασσόμενης μεταβλητής) του αντικειμένου που βρίσκεται στην κορυφή της λίστας list_item it = L.first(); // δημιουργεί ένα «δείκτη» στο πρώτο αντικείμενο της λίστας μας Στο παράδειγμά μας, η L.head() επιστρέφει την τιμή 5 η οποία αποθηκεύεται στη μεταβλητή x, ενώ η L.first() επιστρέφει (δείκτη σ)το ίδιο το αντικείμενο τύπου list_item που βρίσκεται στην κορυφή της λίστας. Μπορούμε να καλέσουμε τώρα την λειτουργία L.contents(it); // επιστρέφει την τιμή της μεταβλητήςπληροφορίας που είναι αποθηκευμένη στο αντικείμενο it της λίστας L. Καλείται επίσης ως L[it] για να διαπιστώσουμε ότι η λογική έκφραση x == L.contents(it) είναι ΑΛΗΘΗΣ. Για παράδειγμα, ισχύει ότι L.head() == L[L.first()]; Παρόμοια, αληθείς είναι οι εκφράσεις 3 == L.contents(L.succ(L.first())) == L[L.succ(L.first())]; L.last()!=L.first(); nil == L.pred(L.first()); L.tail() == L[L.cyclic_pred(L.first())]; L.last() == L.cyclic_pred(L.first()); Παρατηρείστε ότι οι L.head() και L.tail() επιστρέφουν τα περιεχόμενα (δηλαδή την πληροφορία) του πρώτου και του τελευταίου αντικειμένου της λίστας αντίστοιχα, ενώ οι L.first() και L.last() επιστρέφουν τα ίδια τα αντικείμενα (στην κλασσική C θα ήταν δείκτες). Τα αντικείμενα της λίστας μπορούν να εκληφθούν ότι είναι οργανωμένα είτε σε μια γραμμή είτε κυκλικά. Οι λειτουργίες succ και pred μας δίνουν την εντύπωση της γραμμικής παράθεσης των αντικειμένων της λίστας, ενώ οι λειτουργίες cyclic_succ και cyclic_pred υποστηρίζουν την κυκλική παράθεση των στοιχείων της λίστας μας. Για το λόγο αυτό ισχύει για παράδειγμα ότι nil == L.pred(L.first()) == L.succ(L.last()); L.last() == L.cyclic_pred(L.first()); L.first() == L.cyclic_succ(L.last()); Η διαδοχική προσπέλαση όλων των αντικειμένων μιας λίστας (μια πολύ συχνά χρησιμοποιούμενη λειτουργία) γίνεται πολύ απλά με τη χρήση των ακόλουθων βρόχων επανάληψης: forall(x, L) { } // επιστρέφει τις τιμές όλων των στοιχείων που είναι αποθηκευμένα στη λίστα forall_items(it, L) { } // επιστρέφει με τη σειρά όλα τα αντικείμενα (που περιέχουν τα στοιχεία που έχουμε αποθηκεύσει στη λίστα)

ΠΡΟΣΟΧΗ: Η διαφορά μεταξύ των δυο βρόχων έγκειται στο τι είδους πληροφορία κρατά ο μετρητής του βρόχου. Στην πρώτη περίπτωση, στη μεταβλητή x (τύπου E) του πρώτου βρόχου επιστρέφονται οι τιμές των μεταβλητών που φυλάσσονται ως πληροφορία στα αντικείμενα της λίστας. Στη δεύτερη περίπτωση, στη μεταβλητή it (τύπου list_item) επιστρέφεται το εκάστοτε αντικείμενο της λίστας (στην κλασσική C θα μιλούσαμε για δείκτη σε struct). Κατά συνέπεια, το ποιον από τους δυο βρόχους πρέπει να χρησιμοποιήσουμε, εξαρτάται από το τι πληροφορία χρειαζόμαστε στις λειτουργίες που θέλουμε να εκτελέσουμε μέσα στο βρόχο. Ένα απλό τύπωμα της λίστας χρειάζεται μόνο την αποθηκευμένη πληροφορία (άρα μπορούμε να χρησιμοποιήσουμε είτε τον πρώτο είτε τον δεύτερο βρόχο), όμως αν θέλουμε να προσθέσουμε στοιχεία σε συγκεκριμένες θέσεις της λίστας (πχ, με την L.insert( )) τότε χρειαζόμαστε και τα ίδια τα αντικείμενα (άρα το δεύτερο είδος βρόχου). Προγραμματιστική Συμβουλή: Στη LEDA γενικά αποφεύγουμε να χρησιμοποιούμε ως ορίσματα βρόχων επανάληψης ή άλλων συναρτήσεων, το αποτέλεσμα που μας επιστρέφει μια συνάρτηση. Για παράδειγμα, δε θα πρέπει να γράφουμε εντολές της μορφής forall_items(it, f()), όπου f είναι μια συνάρτηση που δημιουργεί ή αλλάζει μια υπάρχουσα λίστα. Λειτουργίες ενημέρωσης Η αλλαγή της πληροφορίας που περιέχει ένα αντικείμενο που ήδη υπάρχει στη λίστα L γίνεται με τη μορφή μιας απλής εκχώρησης τιμής: L[it] = x; Aλλάζει το περιεχόμενο (δηλαδή, την φυλασσόμενη πληροφορία) του αντικειμένου λίστας it Οι ακόλουθες λειτουργίες προσθέτουν νέα πληροφορία στη λίστα μας, και επιστρέφουν το αντικείμενο το οποίο δημιούργησαν και ενσωμάτωσαν στη λίστα L: L.append(x); Aποθηκεύει την πληροφορία (τύπου Ε) x στο περιεχόμενο ενός νέου αντικειμένου, που το προσθέτει στο τέλος της λίστας (μετά το L.last()) L.push(x) ; Aποθηκεύει την πληροφορία (τύπου Ε) x στο περιεχόμενο ενός νέου αντικειμένου, που το προσθέτει στην αρχή της λίστας (πριν το L.first()) L.insert(x, it, leda::after); Aποθηκεύει την πληροφορία (τύπου Ε) x στο περιεχόμενο ενός νέου αντικειμένου λίστας, που το προσθέτει στη λίστα L, αμέσως μετά το αντικείμενο it της L L.insert(x, it, leda::before); Aποθηκεύει την τιμή της μεταβλητής (τύπου Ε) x, στο περιεχόμενο ενός νέου αντικειμένου λίστας, που το προσθέτει στη λίστα L, αμέσως πριν το αντικείμενο it της L

Προσέξτε στη λειτουργία insert τη δυνατότητα που μας δίνει η LEDA να καθορίσουμε την κατεύθυνση ( direction {leda::before, leda::after} ) της προσθήκης του νέου αντικειμένου, σε σχέση με ένα υπάρχον αντικείμενο it της λίστας μας. Οι ακόλουθες λειτουργίες διαγράφουν (PRECONDITION: υπάρχοντα) αντικείμενα από τη λίστα L. Επιστρέφεται κάθε φορά η τιμή του περιεχομένου του αντικειμένου που σβήνουμε (δηλαδή, η πληροφορία που είχε το συγκεκριμένο αντικείμενο). L.del_item(it); Διαγράφει το αντικείμενο it που ήδη βρίσκεται στη λίστα, και επιστρέφει την τιμή L[it] του περιεχομένου του... L.pop(); Διαγράφει το αντικείμενο που βρίσκεται στην κορυφή της λίστας και επιστρέφει την τιμή του... L.Pop(); Διαγράφει το αντικείμενο που βρίσκεται στο τέλος της λίστας και επιστρέφει την τιμή του... Συνένωση Διάσπαση Λιστών Όταν έχουμε δυο (διαφορετικές!) λίστες L, S που αποθηκεύουν πληροφορία του ίδιου τύπου, τότε μπορούμε να τις συνενώσουμε: L.conc(S, dir) Αν dir = leda::after τότε η S τοποθετείται στο τέλος της L. Αν dir = leda::after τότε η S τοποθετείται πριν από την L. Και στις δυο περιπτώσεις, η λίστα που προκύπτει είναι η L ενώ η S καταστρέφεται πλήρως... Από την άλλη πλευρά, μπορούμε να διασπάσουμε μια λίστα L σε δυο τμήματα: L.split(it, S1, S2, dir); Η L διασπάται σε δυο λίστες (που θα πρέπει να είναι διαφορετικές μεταξύ τους) S1 και S2. Αν dir=leda::before, η διάσπαση γίνεται ΠΡΙΝ το αντικείμενο it (το οποίο γίνεται το πρώτο αντικείμενο της S2), ενώ αν dir=leda::after τότε το αντικείμενο it είναι το τελευταίο στοιχείο της S1. Επιτρέπεται σε μια από τις δυο λίστες να είναι η ίδια η L. Αν αυτό δεν ισχύει, τότε η L τελικά είναι άδεια. Μαζικές μεταβολές στην πληροφορία μιας λίστας L.apply(f); Ισοδύναμο με την κλήση forall (x,l){ f( x ) }. Το πέρασμα της x γίνεται με αναφορά... L.reverse_items(); Αντιστρέφει τη σειρά των αντικειμένων της λίστας L... L.permute();

Δημιουργεί μια τυχαία διάταξη των αντικειμένων της λίστας L Ζεύγη μεταβλητών στη LEDA Για να χρησιμοποιήσουμε τον τύπο δεδομένων two_tuple της LEDA, θα πρέπει κατ αρχήν να δηλώσουμε το κατάλληλο header file (tuple.h). Ένα ζεύγος μεταβλητών διαφόρων τύπων μπορεί να οριστεί στη LEDA ως εξής: two_tuple<a,b> p; two_tuple<a,b> q(a,b); Η πρώτη δήλωση απλά δημιουργεί μια μεταβλητή p που απαρτίζεται από δυο μεταβλητές (η πρώτη τύπου A και η δεύτερη τύπου B), ενώ η δεύτερη δήλωση δημιουργεί μια μεταβλητή q που απαρτίζεται από δυο μεταβλητές (η πρώτη τύπου A και η δεύτερη τύπου B), τις οποίες αρχικοποιεί στις τιμές a και b αντίστοιχα. Τα στοιχεία της μεταβλητής p προσπελαύνονται / παίρνουν τιμές ως εξής: Α a = p.first(); p.second() = b; Επίσης μπορούμε να εφαρμόσουμε τους τελεστές == (για σύγκριση μεταβλητών τύπου two_tuple) και << ή >> για διάβασμα ή τύπωμα μιας μεταβλητής two_tuple. Μπορούμε τέλος να δηλώσουμε άλλους παραμετροποιημένους τύπους δεδομένων, που αποθηκεύουν μεταβλητές τύπου two_tuple ως εξής: list<two_tuple<int,int> > L; Προσέξτε ότι μπορούμε εύκολα να διαβάσουμε ΟΛΑ τα στοιχεία μιας λίστας (οποιοδήποτε τύπο δεδομένων κι αν έχει ως πληροφορία) με την L.read λειτουργία των λιστών. Ζητούμενο: Δώστε στο χρήστη τη δυνατότητα να καθορίσει το σύνολο V των στοιχείων (κορυφές του γραφήματος), καθώς και τη λίστα L με τα διατεταγμένα ζεύγη (τόξα) που θέλει να λάβει υπόψη του. Διαπιστώστε αν το συγκεκριμένο στιγμιότυπο έχει τοπολογική διάταξη. Σε περίπτωση που υπάρχει τοπολογική διάταξη του στιγμιοτύπου που δίνεται από το χρήστη, αναπαραστήστε το στην έξοδο. Διαφορετικά, δείξτε συγκεκριμένα για ποιο λόγο δεν υπάρχει τοπολογική διάταξη για το συγκεκριμένο στιγμιότυπο (πχ, ύπαρξη κάποιου κατευθυνόμενου κύκλου στο υπογράφημα που απομένει). Πιο συγκεκριμένα, τυπώστε τα περιεχόμενα της υπόλοιπη λίστας (δηλαδή, τυπώστε τα ζεύγη ακμών που απομένουν στην L, για τα οποία όλοι οι εναπομείναντες κόμβοι (σημεία του V) που δεν έχουν τοποθετηθεί, σχηματίζουν κύκλο.