τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Πίνακας περιεχομένων
Ο αλγόριθμος Floyd, το πλήρες όνομα του αλγόριθμου Floyd-Warshall, είναι ένας δυναμικός αλγόριθμος προγραμματισμού που χρησιμοποιείται για την επίλυση του προβλήματος της συντομότερης διαδρομής μεταξύ όλων των ζευγών κορυφών του γραφήματος. Είναι κατάλληλο για σταθμισμένα κατευθυνόμενα γραφήματα και μπορεί να χειριστεί ακμές αρνητικού βάρους (αλλά όχι γραφήματα που περιέχουν κύκλους αρνητικού βάρους) και μπορεί να ανιχνεύσει εάν υπάρχουν κύκλοι αρνητικού βάρους στο γράφημα.
Η βασική ιδέα του αλγορίθμου του Floyd είναι ο δυναμικός προγραμματισμός και τα βασικά του βήματα είναι τα εξής:
Η υλοποίηση του αλγόριθμου του Floyd χρησιμοποιεί συνήθως έναν τριπλό βρόχο Ο εξωτερικός βρόχος διασχίζει όλες τις ενδιάμεσες κορυφές k και οι δύο εσωτερικοί βρόχοι διασχίζουν όλα τα ζεύγη κορυφών (i, j) για να ελέγξουν αν υπάρχει μικρότερη διαδρομή.
Ας υποθέσουμε ότι έχουμε ένα σταθμισμένο γράφημα G που περιέχει n κορυφές, μπορούμε να χρησιμοποιήσουμε έναν δισδιάστατο πίνακαdist[][]
για να αποθηκεύσετε το μικρότερο μήκος διαδρομής μεταξύ κάθε ζεύγους κορυφών. Αρχικά,dist[i][j]
ορίζεται στο βάρος της άμεσα συνδεδεμένης ακμής στο γράφημα Εάν δεν υπάρχει άμεσα συνδεδεμένη ακμή μεταξύ i και j, τότεdist[i][j]
Ορίστηκε στο άπειρο (που υποδεικνύει ότι δεν είναι προσβάσιμο).
αρχικοποίηση : Δημιουργήστε έναν n×n πίνακα D, όπου το D[i][j] αρχικοποιείται στο βάρος της άμεσης ακμής από i έως j στο γράφημα ή ορίζεται στο άπειρο εάν δεν υπάρχει άμεση ακμή μεταξύ i και j. Διαγώνιο στοιχείο D[i][i] = 0.
δυναμικός προγραμματισμός : Για κάθε κορυφή k (ως ενδιάμεση κορυφή), ενημερώστε τη συντομότερη διαδρομή μεταξύ κάθε ζεύγους κορυφών i και j Είναι δυνατόν να λάβετε μια συντομότερη διαδρομή με το k ως ενδιάμεσο σημείο. Ο τύπος ενημέρωσης είναι: D[i][j] = min(D[i][j], D[i][k] + D[k][j]). Αυτό σημαίνει ότι εάν η διαδρομή από το i στο j γίνει μικρότερη μέσω του k ως ενδιάμεση κορυφή, ενημερώστε το D[i][j].
Έξοδος αποτελέσματος: Μετά από n γύρους επαναλήψεων, κάθε στοιχείο D[i][j] στον πίνακα D είναι το μικρότερο μήκος διαδρομής από το i έως το j.
343. Ταξινόμηση - Τράπεζα Ερωτήσεων AcWing
- #include <algorithm>
- #include <bits/stdc++.h>
- #include <iostream>
- using namespace std;
-
- #define PII pair<int, int>
- #define fi first
- #define se second
- #define endl 'n'
- map<int, int> mp;
-
- const int N = 210, mod = 1e9 + 7;
- int T, n, m, k;
- int a[N], dist[N][N];
- PII ans[N];
-
- void floyd(int x) // 以 x 为中转点,更新其他点。
- {
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= n; j++)
- dist[i][j] = min(dist[i][j], dist[i][x] + dist[x][j]);
- }
-
- bool pd() // 判断是否所有点都已确定
- {
- for (int i = 1; i <= n; i++) {
- int cnt = 0;
- for (int j = 1; j <= n; j++)
- if (dist[i][j] != 1e9)
- cnt++; // 当前点能到达的点数
- ans[i] = {cnt, i};
- for (int j = 1; j <= n; j++)
- if (i != j && dist[j][i] != 1e9)
- cnt++; // 能到达当前点的点数
- if (cnt != n)
- return 0;
- }
- sort(ans + 1, ans + n + 1);
- return 1;
- }
-
- int main() {
- while (cin >> n >> m && n) {
- for (int i = 1; i <= n; i++)
- for (int j = 1; j <= n; j++)
- if (i != j)
- dist[i][j] = 1e9;
-
- int flag = 0;
- for (int i = 1; i <= m; i++) {
- char a, t, b;
- cin >> a >> t >> b;
- int x = a - 'A' + 1, y = b - 'A' + 1; // 现在要加一条从 y 到 x 的边
-
- if (!flag && dist[x][y] != 1e9) // 发现已经从x能到y,出现矛盾
- {
- printf("Inconsistency found after %d relations.n", i);
- flag = 1;
- }
-
- dist[y][x] = 1;
- floyd(x), floyd(y); // 分别以 x 和 y 为中转点更新其他点
- if (!flag && pd()) { // 发现所有点都已确定
- printf("Sorted sequence determined after %d relations: ", i);
- for (int i = 1; i <= n; i++)
- cout << char(ans[i].se + 'A' - 1);
- printf(".n");
- flag = 1;
- }
- }
- if (!flag)
- printf("Sorted sequence cannot be determined.n"); // 无法确定
- }
-
- return 0;
- }
dist
Ο δισδιάστατος πίνακας αρχικοποιείται στο άπειρο, πράγμα που σημαίνει ότι δεν υπάρχει σχέση ορισμένης τάξης μεταξύ των ανισοτήτων από προεπιλογή.dist
Το Matrix, χρησιμοποιώντας τον αλγόριθμο του Floyd για να ενημερώσει τη συντομότερη διαδρομή μεταξύ όλων των ανισοτήτων, εδώ στην πραγματικότητα ενημερώνει τη σχέση "προτεραιότητας" ή "παραγγελίας".