Σταθμοί (stations)
Η ραχοκοκαλιά του διαδικτύου της Σιγκαπούρης (SIB) αποτελείται από σταθμούς, στους οποίους έχουν ανατεθεί δείκτες από το
μέχρι και το
. Υπάρχουν επίσης
αμφίδρομοι σύνδεσμοι, αριθμημένοι από το
μέχρι και το
. Κάθε σύνδεσμος ενώνει δύο διαφορετικούς σταθμούς. Δύο σταθμοί που ενώνονται με ένα σύνδεσμο ονομάζονται γειτονικοί.
Μια διαδρομή από τον σταθμό προς τον σταθμό
είναι μια ακολουθία διαφορετικών σταθμώνm
έτσι ώστε
,
, και κάθε δύο διαδοχικοί σταθμοί στη διαδρομή είναι
γειτονικοί. Υπάρχει \(ακριβώς μία\) διαδρομή από οποιονδήποτε σταθμό
σε οποιονδήποτε άλλο σταθμό
.
Οποιοσδήποτε σταθμός μπορεί να στείλει ένα πακέτο δεδομένων σε οποιονδήποτε άλλο σταθμό
, που ονομάζεται προορισμός του πακέτου. Αυτό το πακέτο πρέπει να δρομολογηθεί κατά μήκος της μοναδικής διαδρομής από το
στο
ως εξής. Θεωρήστε έναν σταθμό
στον οποίο βρίσκεται ένα πακέτο με προορισμό το σταθμό
(
). Σε αυτή την περίπτωση, ο σταθμός
:
- εκτελεί μια διαδικασία δρομολόγησης που καθορίζει το γειτονικό σταθμό
του ο οποίος βρίσκεται στη μοναδική διαδρομή από το
στο
, και
- προωθεί το πακέτο σε αυτόν το γειτονικό σταθμό.
Ωστόσο, οι σταθμοί έχουν περιορισμένη μνήμη και δεν αποθηκεύουν ολόκληρη τη λίστα των συνδέσμων στο SIB για να την χρησιμοποιήσουν στη διαδικασία δρομολόγησης.
Η δική σας δουλειά είναι να υλοποιήσετε ένα σχήμα δρομολόγησης για το SIB, το οποίο να αποτελείται από δύο συναρτήσεις.
- Στην πρώτη συνάρτηση δίνονται ως εισόδοι το
, η λίστα των συνδέσμων στο SIB και ένας ακέραιος
. Αυτή η συνάρτηση αναθέτει σε κάθε σταθμό μια μοναδική ακέραια ετικέτα μεταξύ
και
, συμπεριλαμβανομένων.
- Η δεύτερη συνάρτηση υλοποιεί τη διαδικασία δρομολόγησης που θα ακολουθούν όλοι οι σταθμοί, αφού ανατεθούν οι ετικέτες. Της δίνονται μόνο τα ακόλουθα ως είσοδοι:
, η ετικέτα του σταθμού όπου βρίσκεται ένα πακέτο,
, η ετικέτα του σταθμού-προορισμού του πακέτου (
),
, η λίστα των ετικετών όλων των γειτονικών σταθμών του
.
Η συνάρτηση πρέπει να επιστρέφει την ετικέτα του γεειτονικού σταθμού του στον οποίο πρέπει να προωθηθεί το πακέτο.
Σε ένα υποπρόβλημα, η βαθμολογία της λύσης σας εξαρτάται από την τιμή της μέγιστης ετικέτας που έχει ανατεθεί σε οποιονδήποτε σταθμό (γενικά, πρέπει να προτιμώνται μικρές τιμές ετικετών).
Λεπτομέρειες υλοποίησης
Πρέπει να υλοποιήσετε τις παρακάτω συναρτήσεις:
int[] label(int n, int k, int[] u, int[] v)
: το πλήθος των σταθμών στο SIB.
: η μέγιστη ετικέτα που μπορεί να χρησιμοποιηθεί.
και
: δύο πίνακες μήκους
που περιγράφουν τους συνδέσμους. Για κάθε
(
), ο σύνδεσμος
ενώνει τους σταθμους με δείκτες
και
.
- Αυτή η συνάρτηση πρέπει να επιστρέφει έναν πίνακα
μήκους
. Για κάθε
(
) το
είναι η ετικέτα που ανατίθεται στον σταθμό με δείκτη
. Όλα τα στοιχεία του πίνακα
πρέπει να είναι μοναδικά και μεταξύ του
και του
, συμπεριλαμβανομένων.
int find_next_station(int s, int t, int[] c)
: η ετικέτα του σταθμού όπου βρίσκεται ένα πακέτο.
: η ετικέτα του σταθμού-προορισμού του πακέτου.
: ένας πίνακας που περιέχει τις ετικέτες όλων των γειτονικών σταθμών του
. Ο πίνακας
είναι ταξινομημένος σε αύξουσα σειρά.
- Αυτή η συνάρτηση πρέπει να επιστρέφει την ετικέτα του γειτονικού σταθμού του
στον οποίο πρέπει να προωθηθεί το πακέτο.
Κάθε περίπτωση ελέγχου (test case) περιλαμβάνει ένα ή περισσότερα ανεξάρτητα σενάρια (δηλαδή, διαφορετικές περιγραφές SIB). Για μία περίπτωση ελέγχου που περιλαμβάνει σενάρια, ένα πρόγραμμα το οποίο καλεί τις πιο πάνω συναρτήσεις εκτελείται ακριβώς δύο φορές, ως
ακολούθως.
Κατά την πρώτη εκτέλεση του προγράμματος:
- Η συνάρτηση label καλείται
φορές,
- οι επιστρεφόμενες ετικέτες αποθηκεύονται από το σύστημα αξιολόγησης, και
- η συνάρτηση find_next_station δεν καλείται.
Κατά τη δεύτερη εκτέλεση του προγράμματος:
- η συνάρτηση find_next_station μπορεί να κληθεί πολλές φορές. Σε κάθε κλήση ένα τυχαίο σενάριο επιλέγεται και οι ετικέτες που επιστρέφονται από την κλήση στη συνάρτηση label σε αυτό το σενάριο είναι αυτές που χρησιμοποιούνται σαν εισόδοι στη find_next_station.
- η συνάρτηση label δεν καλείται.
Συγκεκριμένα, οποιεσδήποτε πληροφορίες αποθηκεύονται σε στατικές ή καθολικές μεταβλητές κατά την πρώτη εκτέλεση του προγράμματος δεν είναι διαθέσιμες στη συνάρτηση find_next_station.
Παράδειγμα
Θεωρήστε την ακόλουθη συνάρτηση:
label(5, 10, [0, 1, 1, 2], [1, 2, 3, 4])
Υπάρχουν συνολικά σταθμοί και
σύνδεσμοι που ενώνουν τα ζεύγη σταθμών με δείκτες
,
,
και
. Κάθε ετικέτα μπορεί να είναι ένας ακέραιος από το
μέχρι το
.
Για να αναθέσετε τις παρακάτω ετικέτες:
Δείκτης | Ετικέτα |
0 | 6 |
1 | 2 |
2 | 9 |
3 | 3 |
4 | 7 |
η συνάρτηση label πρέπει να επιστρέψει []. Οι αριθμοί στην πιο κάτω εικόνα δείχνουν τους δείκτες (αριστερά) και τις ετικέτες που ανατίθενται σε κάθε σταθμό (δεξιά).
Υποθέστε ότι οι ετικέτες έχουν ανατεθεί όπως παραπάνω και θεωρήστε την ακόλουθη κλήση:
find_next_station(9, 6, [2, 7])
Αυτό σημαίνει ότι ένα πακέτο βρίσκεται στο σταθμό με ετικέτα και έχει προορισμό το σταθμό με ετικέτα
. Οι ετικέτες των σταθμών στη διαδρομή προς τον προορισμό είναι [
]. Επομένως, η κλήση θα πρέπει να επιστρέψει
2
, δηλαδή την ετικέτα του σταθμού στον οποίο πρέπει να προωθηθεί το πακέτο (ο οποίος έχει δείκτη ).
Θεωρήστε άλλη μια δυνατή κλήση:
find_next_station(2, 3, [3, 6, 9])
Η συνάρτηση πρέπει να επιστρέψει , καθώς ο σταθμός-προορισμός με ετικέτα
είναι γειτονικός του σταθμού με ετικέτα
και επομένως θα πρέπει να λάβει το πακέτο απευθείας.
Περιορισμοί
Για κάθε κλήση στη label:
(για κάθε
)
Για κάθε κλήση στη find_next_station, η είσοδος προέρχεται από μια αυθαίρετα επιλεγμένη προηγούμενη κλήση στην label. Θεωρήστε τις ετικέτες που παρήγαγε. Τότε:
και
είναι ετικέτες δύο διαφορετικών σταθμών.
είναι η ακολουθία των ετικετών όλων των γειτονικών σταθμών του σταθμού με ετικέτα
, σε αύξουσα σειρά.
Για κάθε περίπτωση ελέγχου, το άθροισμα των μηκών όλων των πινάκων που δίνονται στη
συνάρτηση find_next_station δεν υπερβαίνει τις
για όλα τα σενάρια συνολικά.
Υποπροβλήματα
- (
βαθμοί)
, κανένας σταθμός δεν έχει πάνω από
γείτονες.
- (
βαθμοί)
, ο σύνδεσμος
ενώνει τους σταθμούς
και
.
- (
βαθμοί)
, το πολύ ένας σταθμός έχει περισσότερους από
γείτονες.
- (
βαθμοί)
,
- (61 βαθμοί)
Στο υποπρόβλημα μπορείτε να παρετε μερική βαθμολογία (partial scoring). Έστω
η μέγιστη τιμή ετικέτας που επιστρέφει η label σε όλα τα σενάρια. Η βαθμολογία σας σε αυτό το υποπρόβλημα θα υπολογιστεί σύμφωνα με τον ακόλουθο πίνακα:
Μέγιστη ετικέτα | Βαθμολογία |
Υποδειγματικός βαθμολογητής
Ο υποδειγματικός βαθμολογητής διαβάζει την είσοδο ως εξής:
- γραμμή
:
Ακολουθούν τμήματα (blocks), που κάθε ένα περιγράφει ένα σενάριο. Η μορφή κάθε τμήματος έχει ως εξής:
- γραμμή
:
- γραμμή
(
):
- γραμμή
:
: το πλήθος των κλήσεων στην find_next_station.
- γραμμή
(
):
: οι δείκτες των σταθμών που περιλαμβάνονται στην
-οστή κλήση στην find_next_station: ο σταθμός
έχει το πακέτο, ο σταθμός
είναι ο σταθμός-προορισμός του πακέτου και ο σταθμός
είναι ο σταθμός που πρέπει να προωθηθεί.
Η έξοδος του υποδειγματικού βαθμολογητή είναι ως εξής:
- γραμμή
:
Ακολουθούν τμήματα (blocks) που αντιστοιχούν στα διαδοχικά σενάρια της εισόδου. Η μορφή κάθε τμήματος έχει ως εξής:
- γραμμή
(
): ο δείκτης του σταθμού, του οποίου η ετικέτα έχει επιστραφεί με την
-οστή κλήση στην find_next_station σε αυτό το σενάριο.
Να σημειωθεί ότι κάθε εκτέλεση του υποδειγματικού βαθμολογητή καλεί και τις δύο συναρτήσεις, label και find_next_station.
Comments