Étant donné un graphique acyclique dirigé , un sommet est une source si son indegree est nul, ce qui signifie qu'il n'a que des arcs sortants.
Existe-t-il un algorithme de temps linéaire pour trouver une source dans un graphe acyclique dirigé donné?
Question de suivi: peut-on trouver en temps linéaire toutes les sources?
algorithms
graph-theory
breezeintopl
la source
la source
Réponses:
Comme le mentionne Yuval, la structure de données est importante ici. Je vais essayer de donner une solution pour certains des types de listes d'adjacence:
En remarque, si le choix de la structure de données est entre vos mains, vous voudrez peut-être analyser quelles sont toutes les opérations que vous avez l'intention d'effectuer, et à quelle fréquence, et choisir une structure de données appropriée.
Edit: pour le cas 1, si vous avez un dag où le nombre de sources est très petit par rapport à| V| (par exemple, dans un arbre avec une seule source), et où la distance moyenne d'un sommet à une source est petite par rapport à| V| et si vous ne voulez qu'une seule source, vous pouvez utiliser un algorithme plus rapide en moyenne (bien que la pire complexité asymptotique soit la même). Sélectionnez n'importe quel sommet au hasard et accédez à l'un de ses parents (dans la liste des arêtes entrantes), puis à son parent et ainsi de suite, jusqu'à ce que vous atteigniez un nœud qui n'a pas de parent - une source. Ce petit gain d'efficacité concerne des types de graphes très limités avec un algorithme légèrement plus complexe.
la source
Prenons une question plus simple. Supposons que vous savez que votre graphique est un arbre. Ensuite, vous pouvez trouver le nœud source en temps linéaire. Sélectionnez simplement un nœud aléatoire, si c'est la racine, alors vous avez votre réponse, sinon ce devrait être un enfant ou un parent, puis revenez en arrière jusqu'à ce que vous atteigniez la racine. Cela peut être fait enO(|V|−1) .
la source
En supposant que vous avez un graphique G = (V, E) donné au format de liste d'adjacence. (pour être clair ici, la liste contient tous les bords sortants de la source). Vous pouvez construire l'inverse du graphe G en temps linéaire. Ensuite, vous pouvez parcourir le graphique inverse et collecter tous les sommets qui ont une liste d'adjacence vide. Ces sommets n'ont pas de bord sortant dans le graphique inverse, ce qui signifie qu'ils n'ont pas de bord entrant dans le graphique d'origine, ce sont donc vos sommets source.
Le temps de course est linéaire. La construction de l'inverse du graphique prend un maximum de temps O (| V | + | E |). Itérer sur l'inverse du graphe prend O (| V |) temps.
la source