2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Tabula contentorum
Algorithmus Floyd, plenum algorithmi Floyd-Warshalli nomen, est dynamica programmandi algorithmus usus ad solvendam quaestionem brevissimam inter omnia paria vertices in grapho. Idoneum est ad graphas directas ponderatas et ancipites ponderis negativi (non autem graphi ponderis cyclorum negativorum continentes), et deprehendere potest num ponderis cycli negativi sint in grapho.
Coro notio algorithmi Floyd programmatio dynamica est, cuius gradus fundamentales sunt hae:
Exsecutio algorithmi Floyd triplicem ansam adhibet. Ansa exterior omnes vertices intermedios percurrit k, et duo interiora ansulae omnes binae vertex (i, j) ad reprimendam utrum via brevior sit.
Ponamus nos graphi G ponderati habentes n vertices, duplici dimensione ordinatadist[][]
brevissimam longitudinem inter binos vertices condere. Initio:dist[i][j]
ponitur ad pondus marginem directe connexum in graphdist[i][j]
Pone in infinitum (indicating unreachable).
initialization " : Crea n×n matrix D, ubi D[i][j] pondo marginis directi ab i ad j in graphum initialized, vel in infinitum pone, si nulla ora directa inter i et j. Elementum diametri D[i][i] = 0 .
dynamic programming : Uterque vertex k (ut vertex intermedius) iter brevissimam renovat inter singulas binas vertices i et j. Formula renovationis est: D[i][j] = min(D[i][j], D[i][k] + D[k][j]). Id est, si via ab i ad j brevior fiat per k ut vertex intermedia, renovatio D[i][j].
Exitus output: Post n orbes iterations, elementum D[i][j] quodlibet in matrice D est longitudo brevissima ab i ad j.
343. Sorting - AcWing Quaeritur Bank
- #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
Duo dimensiva ordinatio initialis est in infinitum, quae significat nullum ordinem certum inter inaequalitates per defaltam habitudinem.dist
Matrix, algorithmo Floyd usus ad brevissimum iter inter omnes inaequalitates renovandum, hic actu adaequat relationem "prioritatis" vel "ordinationis".