Quel est le moyen le plus efficace pour déterminer si un graphe orienté est seul connecté?
Je suis en train de travailler sur une mission où l'un des problèmes de demande de dériver un algorithme pour tester si un graphe orienté G=(V,E) est le seul connecté (il y a au plus un simple chemin de u à v pour tous distincts des sommets u,v de V.
Bien sûr, vous pouvez la force brute de vérifier, c'est ce que je suis en train de faire maintenant, mais je veux savoir si il y a un moyen plus efficace. Quelqu'un pourrait-il me diriger dans la bonne direction?
source d'informationauteur zebraman | 2010-03-24
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé DFS.
Complexité O(v^2), o(v) dfs comme aucune répétition.
Il y a une meilleure réponse à cette question. vous pouvez le faire en O(|V|^2). et avec plus d'effort, vous pouvez le faire dans le temps linéaire.
D'abord vous trouver fortement les composantes connexes de G. dans chaque élément, vous de recherche pour trouver ce cas:
1) si il y a une avant-garde dans ce composant, il n'est pas seul connecté,
2) si il y a une croix de pointe dans ce composant, il n'est pas seul connecté,
3) si il y a au moins deux arêtes de l'arbre enraciné au sommet u, bon ancêtres de u, alors il n'est pas seul connecté.
cela peut être fait en O(E). ( Je pense que sauf pour le cas 3. Je ne pouvais pas la mettre en œuvre!! ).
Si aucun des cas ci-dessus, vous devriez vérifier si il y a une croix de bord ou un bord avant sur G^CSC ( graphe G, avec une forte composants remplacés par les nœuds simples), puisque nous n'avons pas backedges, il peut être fait en répétant dfs sur chaque sommet de ce graphe en O(|V|^2).
Lire cette une. Il explique vraiment bien.
Je ne suis pas d'accord que sa complexité O(V^2), comme Dans DFS nous ne les appelons pas cela pour chaque vertex que de voir dans l'Introduction à l'algorithme de livre aussi, la syntaxe est DFS(G). Nous n'appelons DFS pour tout graphe non pas pour un seul sommet à la différence de BFS. Donc, ici, dans ce cas, selon moi, nous devons vérifier en appelant DFS une fois.Si un sommet visité est à nouveau rencontrés, le graphique n'est pas seul connecté(certainement, nous devons faire appel pour chaque composant déconnecté, mais il est déjà inclus dans le code). DONC, la complexité O(V+E). Comme ici E=V donc la complexité devrait être O(V).
J'ai pensé à ceci :
1) Exécuter DFS à partir d'un sommet quelconque, si tous les sommets sont couverts dans le DFS avec pas en avant arêtes(il ne peut y avoir de la croix comme d'autre pas tous les sommets seront couverts), alors il peut être un candidat potentiel.
2) Si un sommet(niveau j) qui se trouve dans le DFS a un bord arrière au niveau i alors qu'aucun autre sommet trouvé après il doit avoir un bord arrière vers un sommet quelconque avec moins de j et tous les sommets bien être accessible à la racine(vérifié avec le deuxième DFS).
Ce fait en temps linéaire si cela est correct.
Prendre un coup d'oeil à la définition de chemin simple. Un graphe cyclique peut être individuellement connecté.
DFS
de ne pas travailler pourA->B, B->A
qui est le seul connecté.Le document suivant utilise fortement la composante connexe de résoudre ce problème.
https://www.cs.umd.edu/~samir/subvention/khuller99.ps
Exécuter DFS fois à partir de chaque sommet. Le graphique est individuellement reliés si et
seulement si il n'existe pas en avant arêtes et il n'y a pas les bords de la croix à l'intérieur d'un
composante.
Complexité : O(V. E)