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.

Était-ce utile?

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 $ E_I $ .Ensuite, la longueur du chemin le plus court vers un nœud $ n $ in $ l_ {i + 1} $ est défini par $ \ min \ {w (x, n) + s (x) \ moyenne (x, n) \ in e_i \} $ .Maintenir les chemins réels est une extension facile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à cs.stackexchange
scroll top