Chemin le plus court en ligne dans la commande DAG
-
29-09-2020 - |
Question
Supposons que j'ai un dag enraciné connecté au bord de bord $ g= (v, e, r \ in v, w \ in e \ to \ mathbb {z}) $ où il existe une séquence de jeux non impartisés (appelés "niveaux") $ l_0={r \}, l_1 \ sous-ensemble v, \ ldots, l_n \ sous-ensemble v $ tel que $ l_0 \ tasse \ ldots \ tasse l_n= v $ et les bords sortants des nœuds dans $L_i $ se connecte uniquement aux nœuds dans $ l_ {i + 1} $ .
.Y a-t-il un algorithme en ligne capable de conserver un ensemble de chemins les plus courts, car plusieurs niveaux sont ajoutés à ce DAG?En d'autres termes, il peut répondre à la requête "Quel est le chemin de poids minimum de la racine à un nœud $ n $ dans le niveau inférieur du graphique?", MêmeComme d'autres niveaux sont ajoutés.
Je n'ai pas pu trouver de recherches concernant cette question.
La solution
Si je comprends votre problème correctement, vous n'avez probablement pas trouvé de recherche car le problème est facile à résoudre.
Sauf si j'ai manqué quelque chose, vous voulez maintenir une "couche" de la classe "en couches" sur le bord ">" math-conteneur "> $ g= (l_0, \ tasse \ tasse \ tasse l_k, e) $ (tel que défini dans votre question) et soutenez les deux opérations suivantes:
-
init (): créez un graphique avec une seule couche $ l_0 $ , un seul sommet $ r \ in l_0 $ et pas de bords.
-
Query (): retour $ \ min_ {v \ in l_k} d (r, v) $ .
. -
add_layer ( $ l_ {k + 1}, e '$ ): vous recevez un nouvel ensemble $ L_ {k + 1} $ de sommets et un ensemble de bords pondérés $ E '\ Subreteq (l_k \ fois l_ {k + 1}) $ . L'ensemble de vertex de $ g $ est mis à jour à $ l_0 \ tasse \ ldots \ tasse l_k \ tasse l_ {k + 1 } $ et le jeu de bord de $ g $ est mis à jour à $ e \ tasse E '$ .
Vous pouvez faire ce qui précède en stockant: 1) pour chaque sommet $ v \ in l_k $ , la distance $ D [v] $ formulaire $ S $ à $ v $ in $ g $ , et 2) la distance minimale $ D ^ * $ de $ S $ à un sommet du dernier niveau.
L'opération init permet de régler d [r]= 0 $ . Pour effectuer l'opération de requête, renvoyez simplement $ D ^ * $ .
Pour implémenter add_layer ( $ l_ {k + 1}, e '$ ), vous procédez comme suit:
- SET $ D ^ * $ TO $ + \ \ PLAN $ ,
- pour chaque sommet $ v \ in l_ {k + 1} $ :
- SET D [V]= + \ PLUS $
- pour chaque bord $ (u, v) $ in $ E '$ :
- mise à jour $ d [v] $ à $ \ min \ d [v], d [u] + w (u, v) \} $
- mise à jour $ D ^ * $ à $ \ min \ d ^ *, d [v] \} $ $
Notez que cela nécessite du temps proportionnel à $ | l_ {k + 1} | + | E '| $ , et est donc asymptotiquement optimal. Notez également que cette solution n'a pas besoin de stocker $ g $ .
Autres conseils
Supposons que vous ayez la longueur des chemins les plus courts de la racine à tous les nœuds du niveau $ l_i $ et appelez cette $ s \ in l_i \ to \ mathbb {z} $ .Supposons maintenant que les bords de $ l_i $ to $ l_ {i + 1} $ sont appelés