Un graphe orienté est dit unipathique si pour deux sommets et dans le graphe , il y a au plus un chemin simple de à .v G = ( V , E ) u v
Supposons que l'on me donne un graphe unipathique tel que chaque bord a un poids positif ou négatif, mais ne contient aucun cycle de poids négatif.
De cela , je veux trouver un algorithme qui trouve tous les chemins les plus courts à tous les nœuds d'un nœud source .s
Je ne sais pas comment j'allais aborder ce problème. J'essaie de voir comment je pourrais utiliser le fait qu'il ne contient aucun cycle de poids négatif et bien sûr au plus un chemin simple entre n'importe quel nœud à .v
algorithms
graphs
gprime
la source
la source
Réponses:
Choisissez une représentation des données
Tout d'abord, regardez la taille du résultat. Vous voulez la collection des chemins les plus courts de vers tous les autres nœuds. Sauf si la longueur moyenne d'un chemin est limitée par une constante (ce qui n'est pas le cas: toute liste est unipath, et si vous prenez la racine de la longueur totale des chemins est où est la longueur de la liste), vous devrez être prudent dans votre représentation des données: la structure contenant les chemins devra utiliser le partage entre les chemins.s n ( n - 1 ) / 2 ns s n(n−1)/2 n
Je propose de stocker le résultat dans un tableau, indexé par des nœuds numérotés de à , avec . Chaque élément du tableau stocke l'index du nœud précédent sur le chemin vers ce nœud (utilisez par exemple comme marqueur spécial pour les nœuds inaccessibles depuis ). Le chemin de à sera .| E | - 1 s = 0 - 1 s s t ( s = R [ … R [ t ] … ] , … , R [ R [ t ] ] , R [ t ] , t )0 |E|−1 s=0 −1 s s t (s=R[…R[t]…],…,R[R[t]],R[t],t)
Parcourez le graphique
Initialisez à tous .- 1R −1
Effectuez une traversée en profondeur ou en largeur du graphique à partir de . Chaque fois qu'un nœud est atteint, définissez sur son prédécesseur.u R [ u ]s u R[u]
Puisqu'il y a des cycles, un nœud peut être atteint plus d'une fois. Avoir indique que a déjà été visité.uR[u]≠−1 u
Prouvez l'exactitude
Prouvez la complexité
L'algorithme peut atteindre chaque nœud plus d'une fois, il n'est donc pas clair que sa complexité soit . Le travail effectué est en fait où sont les arêtes accessibles depuis la source. Plus précisément, nous atteignons un nœud plus d'une fois dans une seule circonstance: si le nœud est le premier que nous atteignons sur un cycle particulier, et dans ce cas nous l'atteignons deux fois (une fois à partir d'un chemin simple et une fois après avoir terminé le cycle ).Θ ( | E 0 | ) V 0O(|V|) Θ(|E0|) V0
Eh bien. Prouvons que dans un graphe unipathique, le nombre de cycles élémentaires croît au plus linéairement avec le nombre de nœuds. (Un cycle élémentaire est un cycle qui ne contient pas de cycle plus court.) Dans la discussion suivante, je suppose que le graphique n'a pas d'arête propre (pas d'arête d'un nœud à lui-même; ces arêtes sont de toute façon non pertinentes pour la construction du chemin ).
Les graphes unipathiques peuvent avoir des cycles, mais de manière très contrainte. Ce serait bien si nous pouvions d'une manière ou d'une autre associer chaque cycle à un nœud distinct (ou au moins, un nombre limité de cycles par nœud). Les cycles peuvent-ils partager un nœud? Malheureusement oui.
Nous devrons donc travailler plus dur. Eh bien, essayons de le prouver par induction. Soit le nombre de nœuds dans un graphe , le nombre d'arêtes et le nombre de cycles élémentaires qui ne sont pas des auto-arêtes. J'affirme que si est unipathique et n'est pas vide alors .G # E ( G ) # C ( G ) G # C ( G ) ≤ # V ( G ) - 1#V(G) G #E(G) #C(G) G #C(G)≤#V(G)−1
Pour un graphique à un ou deux nœuds, cela est évident. Supposons que l'assertion soit vraie pour tous les graphes tels que et que soit un graphe unipathique avec nœuds. Si n'a pas de cycle, , le dossier est clos. Sinon, soit un cycle élémentaire.#V(G)<n G n G 0=#C(G)<#V(G) (a1,…,am)
Ceci conclut la preuve. La traversée suit au maximum arêtes.2|V|−2
la source