Wdrożyłem algorytm Floyd Warshall i działa, ale problem polega na tym, że nie wiem, jak znaleźć wszystkie ścieżki, które nie są zdefiniowane. Szukałem w Internecie, ale mogę znaleźć tylko odpowiedzi, jak wykryć, czy wykres ma ujemne cykle, czy nie.Floyd-Warshall z ujemnymi cyklami. Jak znaleźć wszystkie niezdefiniowane ścieżki?
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;
}
Po uruchomieniu algorytmu na wykresie:
from: to: weight:
0 1 1
1 2 -1
2 1 -1
1 3 1
4 0 1
uzyskać macierz sąsiedztwa:
| 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
wiem, że jeśli węzeł i jest częścią negatywnej cyklu Ma wartość ujemna w pozycji d [i] [i] w macierzy. Jeśli więc sprawdzę przekątną macierzy, mogę znaleźć wszystkie węzły, które są częścią ujemnego cyklu. Jeśli spojrzymy w powyższy przykład, widzimy, że węzły 1 i 2 są częścią cyklu ujemnego. Chodzi o to, że chcę znaleźć, które ścieżki są zdefiniowane i które nie są zdefiniowane. Jeśli możesz przejść od A do B przez ujemny cykl, długość ścieżki powinna być nieokreślona, ponieważ może być dowolnie mała.
Pytanie brzmi: jak mogę znaleźć wszystkie niezdefiniowane ścieżki?
że chce algorytm powróci macierz: (zamiast tego, wyżej)
| 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
gdzie D [i] [j] = INF oznacza, że nie ma ścieżki między I i J, oraz - INF oznacza, że istnieje arbitralna mała ścieżka między i i j (ścieżka przechodzi gdzieś ujemną pętlę), a poza tym d [i] [j] jest najkrótszą długością między i i j.
Myślałem o testowaniu każdej ścieżki, ale to byłoby zbyt wolne. Musi istnieć jakiś standardowy sposób rozwiązania tego problemu, prawda?
Dziękuję