Ich habe den Floyd Warshall-Algorithmus implementiert und es funktioniert, aber das Problem ist, dass ich nicht weiß, wie ich alle Pfade finden kann, die nicht definiert sind. Ich habe im Internet gesucht, aber ich kann nur Antworten finden, um festzustellen, ob ein Diagramm negative Zyklen hat oder nicht.Floyd-Warshall mit negativen Zyklen. Wie finde ich alle nicht definierten Pfade?
vector< vector <int> > floyd_warshall(vector< vector<int> > d, int n){
for(int i = 0; i < n; i++) d[i][i] = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
for(int k = 0; k < n; k++){
if(d[j][i] + d[i][k] < d[j][k] and d[j][i] != INF and d[i][k] != INF){
d[j][k] = d[j][i] + d[i][k];
}
}
}
}
return d;
}
Nach dem Algorithmus auf dem Graphen läuft:
from: to: weight:
0 1 1
1 2 -1
2 1 -1
1 3 1
4 0 1
Ich erhalte die Adjazenzmatrix:
| 0 1 2 3 4
--|----------------------------
0 | 0 -1 -2 -2 INF
1 | INF -2 -3 -3 INF
2 | INF -3 -4 -4 INF
3 | INF INF INF 0 INF
4 | 1 -2 -3 -7 0
Ich weiß, dass, wenn der Knoten i Teil eines negativen Zyklus ist es eine hat negativer Wert an der Position d [i] [i] in der Matrix. Wenn ich also die Diagonale der Matrix überprüfe, kann ich alle Knoten finden, die Teil eines negativen Zyklus sind. Wenn wir uns das obige Beispiel ansehen, können wir sehen, dass Knoten 1 und 2 Teile eines negativen Zyklus sind. Die Sache ist, dass ich herausfinden möchte, welche Pfade definiert sind und welche nicht definiert sind. Wenn Sie von A nach B durch einen negativen Zyklus kommen können, sollte die Länge des Pfades undefiniert sein, da er beliebig klein sein kann.
Die Frage ist also, wie kann ich alle undefinierten Pfade finden?
Ich möchte den Algorithmus die Matrix zurückzukehren: (statt der oben)
| 0 1 2 3 4
--|----------------------------
0 | 0 -INF -INF -INF INF
1 | INF -INF -INF -INF INF
2 | INF -INF -INF -INF INF
3 | INF INF INF 0 INF
4 | 1 -INF -INF -INF 0
Wo d [i] [j] = INF bedeutet, dass es keinen Weg zwischen i und j, und - INF bedeutet, dass es einen beliebigen kleinen Pfad zwischen i und j gibt (der Pfad passiert irgendwo eine negative Schleife) und ansonsten ist d [i] [j] die kürzeste Länge zwischen i und j.
Ich dachte an jeden einzelnen Pfad zu testen, aber das wäre wahrscheinlich zu langsam. Es muss einen Standardweg geben, um dieses Problem zu lösen, oder?
Vielen Dank