Σύνδεση υπερδέντρων (supertrees)
Οι κήποι στην προβλήτα (Gardens by the Bay) είναι ένα μεγάλο φυσικό πάρκο στη Σιγκαπούρη. Στο πάρκο αυτό υπάρχουν πύργοι, γνωστοί ως "υπερδέντρα" supertrees. Οι πύργοι είναι αριθμημένοι από
έως και
. Θέλουμε να κατασκευάσουμε ένα σύνολο από μηδέν ή περισσότερες γέφυρες. Κάθε γέφυρα συνδέει ένα ζεύγος διαφορετικών πύργων και μπορεί κανείς να τη διασχίσει και προς τις δύο κατευθύνσεις. Δεν πρέπει να υπάρχουν δύο γέφυρες που να συνδέουν το ίδιο ζεύγος πύργων.
Ένα μονοπάτι από τον πύργο στον πύργο
είναι μία ακολουθία αποτελούμενη από έναν ή περισσότερους πύργους, τέτοια ώστε:
- το πρώτο στοιχείο της ακολουθίας είναι το
,
- το τελευταίο στοιχείο της ακολουθίας είναι το
,
- όλα τα στοιχεία της ακολουθίας είναι διαφορετικά, και
- κάθε δύο διαδοχικά στοιχεία (πύργοι) της ακολουθίας συνδέονται μεταξύ τους με μία γέφυρα.
Προσέξτε ότι, εξ ορισμού, υπάρχει ακριβώς ένα μονοπάτι από κάποιον πύργο προς τον εαυτό του και ότι το πλήθος των διαφορετικών μονοπατιών από τον πύργο προς τον πύργο
είναι το ίδιο με το πλήθος των διαφορετικών μονοπατιών από τον πύργο
προς τον πύργο
.
Ο αρχιτέκτονας του πάρκου θέλει να κατασκευαστούν οι γέφυρες με τέτοιο τρόπο ώστε για κάθε να υπάρχουν ακριβώς
διαφορετικά μονοπάτια από τον πύργο
προς τον
πύργο
, όπου
.
Κατασκευάστε ένα σύνολο από γέφυρες που να ικανοποιεί τους περιορισμούς του αρχιτέκτονα, ή αποφασίστε ότι αυτό είναι αδύνατο.
Λεπτομέρειες υλοποίησης
Πρέπει να υλοποιήσετε την παρακάτω συνάρτηση:
int construct(int[][] p)
: ένας πίνακας διαστάσεων
x
που περιέχει τους περιορισμούς του αρχιτέκτονα.
- Αν η κατασκευή είναι εφικτή, η συνάρτηση αυτή πρέπει να καλέσει ακριβώς μία φορά την
build (βλ. παρακάτω) για να αναφέρει πώς θα γίνει η κατασκευή, και στη συνέχεια πρέπει να
επιστρέψει
1
. - Διαφορετικά, η συνάρτηση πρέπει να επιστρέψει
0
χωρίς να καλέσει καμία φορά την build. - Η συνάρτηση αυτή θα κληθεί ακριβώς μία φορά.
Η συνάρτηση build ορίζεται ως εξής:
void build(int[][] b)
: ένας πίνακας διαστάσεων
x
, όπου
αν υπάρχει γέφυρα που να συνδέει τους πύργους
και
, ή
διαφορετικά.
- Προσέξτε ότι στον πίνακα αυτόν πρέπει να είναι
για κάθε
και
για κάθε
.
Παραδείγματα
Παράδειγμα 1
Θεωρήστε την παρακάτω κλήση:
construct([[1, 1, 2, 2], [1, 1, 2, 2], [2, 2, 1, 2], [2, 2, 2, 1]])
Αυτό σημαίνει ότι πρέπει να υπάρχει ακριβώς ένα μονοπάτι από τον πύργο προς τον πύργο
. Για όλα τα άλλα ζεύγη πύργων (
,
), τέτοια ώστε
, πρέπει να υπάρχουν ακριβώς δύο μονοπάτια από τον πύργο
προς τον πύργο
. Αυτό μπορεί να επιτευχθεί με
γέφυρες, που να συνδέεουν τα ζεύγη πύργων (
), (
), (
) και (
).
Για να αναφερθεί αυτή τη λύση, η συνάρτηση construct πρέπει να καλέσει την build ως εξής:
build([[0, 1, 0, 0], [1, 0, 1, 1], [0, 1, 0, 1], [0, 1, 1, 0]])
Στη συνέχεια πρέπει να επιστρέψει 1
.
Στην περίπτωση αυτή, υπάρχουν πολλές διαφορετικές κατασκευές που ικανοποιούν τους περιορισμούς του αρχιτέκτονα. Οποιαδήποτε από αυτές τις κατασκευές θεωρείται σωστή.
Παράδειγμα 2
Θεωρήστε την παρακάτω κλήση:
construct([[1, 0], [0, 1]])
Αυτό σημαίνει ότι δεν πρέπει να υπάρχει τρόπος να μετακινηθεί κανείς μεταξύ των δύο πύργων. Αυτό μπορεί να ικανοποιηθεί αν δεν κατασκευαστεί καμία γέφυρα.
Επομένως, η συνάρτηση construct πρέπει να κάνει την εξής κλήση:
- build([[0, 0], [0, 0]])
Στη συνέχεια, η construct πρέπει να επιστρέψει 1
.
Παράδειγμα 3
Θεωρήστε την παρακάτω κλήση:
construct([[1, 3], [3, 1]])
Αυτό σημαίνει ότι πρέπει να υπάρχουν ακριβώς μονοπάτια από τον πύργο
προς τον πύργο
. Αυτό το σύνολο περιορισμών δεν μπορεί να ικανοποιηθεί. Επομένως, η συνάρτηση construct πρέπει να επιστρέψει
0
χωρίς να κάνει καμία κλήση στην build.
Περιορισμοί
(για κάθε
)
(για κάθε
)
(για κάθε
)
Υποπροβλήματα
- (
βαθμοί)
(για κάθε
)
- (
βαθμοί)
ή
(για κάθε
)
- (
βαθμοί)
ή
(για κάθε
,
)
- (
βαθμοί)
(για κάθε
) και υπάρχει τουλάχιστον μία κατασκευή που να ικανοποιεί τους περιορισμούς.
- (
βαθμοί)
(για κάθε
- (
βαθμοί) Χωρίς επιπλέον περιορισμούς.
Υποδειγματικός βαθμολογητής
Ο υποδειγματικός βαθμολογητής διαβάζει την είσοδο ως εξής:
- γραμμή
:
- γραμμή
+
(
):
Η έξοδος του υποδειγματικού βαθμολογητή είναι ως εξής:
- γραμμή
: η τιμή επιστροφής της construct.
Αν η τιμή επιστροφής της construct είναι , ο υποδειγματικός βαθμολογητής τυπώνει επιπλέον:
- γραμμή
+
(
):
Comments