Po pierwsze, wykonaj DFS na wykresie, zaczynając od węzła źródłowego, który, jak mówisz, jest znany z góry. Jeśli napotkasz tylną krawędź [1], masz cykl i możesz wyjść z błędem.Podczas tego przejścia możesz określić, czy istnieją węzły, których nie można uzyskać ze źródła [2], i podjąć odpowiednie działanie.
Po ustaleniu wykres jest DAG, można zapewnić, że każdy węzeł znajduje się na ścieżce od źródła do zlewu przez innego DFS, począwszy od źródła, co następuje:
bool have_path(source, sink) {
if source == sink {
source.flag = true
return true
}
// traverse all successor nodes of `source`
for dst in succ(source) {
if not dst.flag and not have_path(dst, sink)
return false // exit as soon as we find a node with no path to `sink`
}
source.flag = true;
return true
}
procedura have_path
ustawia wartość logiczną flag
w każdym węźle, dla którego istnieje pewna ścieżka od tego węzła do zlewu. W tym samym czasie procedura przechodzi tylko przez węzły osiągalne ze źródła i przechodzi przez wszystkie węzły osiągalne ze źródła. Jeśli procedura zwraca wartość true, wszystkie węzły dostępne z źródła znajdują się na ścieżce prowadzącej do zlewu. Nieosiągalne węzły były już obsługiwane w pierwszej fazie.
[1] krawędź łączący węzeł o większej liczby DFS węzła przy mniejszej liczbie DFS, że nie jest już całkowicie przetworzony, to znaczy jest nadal DFS stos
[2 ] eg nie będą miały przydzielonego numeru DFS
Znajdź silnie połączone komponenty. Następnie masz źródło CC i sink CC. Sprawdź, czy oba zawierają tylko jeden element. Złożoność jest również liniowa. –
Właściwie, czy algorytm Tarjana nie jest silnym związkiem? –