Comment faire pour déterminer si deux nœuds sont connectés?
Je suis inquiète de ce que cela pourrait être de travailler sur un problème NP-Complet de problème. J'espère que quelqu'un peut me donner une réponse quant à savoir s'il est ou pas. Et je suis à la recherche de plus d'une réponse que de simplement oui ou non. J'aimerais savoir pourquoi. Si vous pouvez dire,"C'est essentiellement ce problème" x " qui est/n'est pas NP-Complet. (lien wikipédia)"
(Non ce n'est pas de devoirs)
Est-il un moyen pour déterminer si les deux points sont reliés sur l'arbitraire d'un non-graphe orienté. par exemple, les suivantes
Well
|
|
A
|
+--B--+--C--+--D--+
| | | |
| | | |
E F G H
| | | |
| | | |
+--J--+--K--+--L--+
|
|
M
|
|
House
Points de A si M (pas de 'je') sont des points de contrôle (comme une soupape dans une conduite de gaz naturel) qui peut être ouvert ou fermé. Le '+'s sont des nœuds (comme le tuyau T), et je suppose que le Bien et la Maison sont aussi des nœuds.
Je voudrais savoir si je ferme l'arbitraire d'un point de contrôle (par exemple, C) si le Bien et de Maison sont toujours connecté (d'autres points de contrôle peut également être fermé). E. g., si B, K et D sont fermés, nous avons encore un chemin à travers les Un-E-J-F-C-G-L-M, et la fermeture de C débranchez le Puits et la Maison. Bien sûr; si D a été fermé, la fermeture ne C ne débranchez pas la Maison.
Un autre moyen de mettre cela, C est un pont/cut-edge/isthme?
J'ai pu traiter chaque point de contrôle comme un poids sur le graphique (soit 0 pour ouvrir ou de 1 à huis-clos); et ensuite trouver le chemin le plus court entre le Bien et de la Maison (suite >= 1 indique qu'ils ont été déconnectés. Il y a diverses façons de court-circuit de l'algorithme pour trouver le chemin le plus court (par exemple, jetez un chemin une fois qu'il atteint 1, arrêter la recherche, une fois que nous avons TOUT chemin qui relie le Puits et la Maison, etc.). Et bien sûr, je peux aussi le mettre dans certains artificielle limite sur le nombre de sauts à vérifier avant d'abandonner.
Quelqu'un doit avoir classé ce genre de problème avant, je suis en manque juste le nom.
Vous trouverez un exemple de code avec exemple & explications ici.
en.wikipedia.org/wiki/Connected_component_%28graph_theory%29
OriginalL'auteur BIBD | 2008-12-09
Vous devez vous connecter pour publier un commentaire.
Voir http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm , votre guichet unique pour tous les graphique problèmes connexes. Je crois que votre problème est en fait résoluble dans quadratique du temps.
parce que je ne peux rien faire... bien sûr, certaines choses prennent un peu plus de temps et coûtent plus chers que d'autres choses - mais doté de ressources suffisantes, je peux le faire.
Ne serait pas un simple BFS / DFS être assez? Dijkstra un tas et est un peu plus lent qu'à la BFS. Pour savoir si deux sommets sont reliés, généralement immédiate suspect est de composants connectés. Il ne s'inquiète pas des poids des arêtes... seulement si ils sont connectés. je ne sais pas pourquoi c'est la réponse. désolé.
OriginalL'auteur Nick Gebbie
Votre description, ce qui semble indiquer que vous êtes intéressé à savoir si les deux nœuds sont connectés, ne trouvant pas le chemin le plus court.
Trouver si deux nœuds sont connectés, il est relativement facile:
Si vous utilisez une table de hachage ou quelque chose de similaire pour toDoSet et doneSet, je crois que c'est un algorithme linéaire.
Noter que cet algorithme est essentiellement la marque de la partie de mark-and-sweep de collecte des ordures.
Si toDoSet est autre chose qu'un vecteur, puis en ajoutant fera le vérifier si il est déjà là. Je vais mettre à jour la réponse.
Il est intéressant de noter que c'est tout simplement une largeur de recherche. Soit ce ou un DFS va travailler en O(n) temps (où n est le nombre de sommets du graphe).
David, vous avez raison, je pourrais le modèle de ce que si les nœuds sont connectés ou pas (donc, je vais vous donner un +1). Cependant, parce que les points de contrôle sur les bords (et change souvent), il est plus facile pour moi de modèle comme un plus court chemin (et de faire un fermé de point de contrôle TRÈS cher).
Le résultat est pratiquement le même pour les deux connectés et le chemin le plus court, et similaire au moment de l'exécution.
OriginalL'auteur David Norman
Vous n'avez pas besoin de l'algorithme de Dijkstra pour ce problème, car il utilise un Tas qui n'est pas nécessaire, et introduit un facteur de log(N) pour votre complexité. C'est juste de la largeur de recherche ne comprennent pas les bords fermés que les arêtes.
OriginalL'auteur Gwildore
Le problème de trouver le chemin le plus court n'est pas NP-complet. Il est appelé le Chemin le plus court Problème (à l'origine assez) et il y a les algorithmes de pour résoudre un grand nombre de différentes variations de lui.
Le problème de déterminer si deux nœuds sont connectés n'est pas NP-complet. Vous pouvez utiliser un parcours en profondeur d'abord de recherche de départ à chaque nœud afin de déterminer s'il est connecté à l'autre nœud.
OriginalL'auteur Bill the Lizard
pas NP-complet, résolu avec une solution bien connue - L'Algorithme de Dijkstra
OriginalL'auteur Steven A. Lowe
Pour moi, il semble que vous soyez sur une solution, mais il est possible que j'ai mal compris le problème. Si vous le faites comme vous le dites, et de donner les bords fermés 1 de poids, vous pouvez simplement appliquer l'algorithme de Dijkstra, http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm. Cela devrait résoudre votre problème dans O(E*lg(V))
OriginalL'auteur torb
En supposant que vous avez une matrice de contiguïté:
Où bool[i,j] = vrai si il y a un chemin entre i et j et bool[i,i] = false.
Ici est une version récursive de l'algorithme ci-dessus (écrit en Ruby):
OriginalL'auteur LeppyR64
Si vous avez besoin de déterminer si 2 nœuds sont connectés, vous pouvez utiliser des ensembles au lieu de cela, ce qui est plus rapide que les algorithmes sur les graphes.
Au début de votre nœuds seront chacun dans son ensemble,
Que l'algorithme progresse et fusionne les jeux, il est relativement moitiés de l'entrée.
Dans l'exemple ci-dessus, j'ai été à la recherche pour voir si il y avait un chemin entre o1 et o2. J'ai trouvé ce chemin uniquement à la fin, après la fusion de tous les bords. Certains graphiques peuvent avoir des composants distincts (déconnecté) ce qui implique que vous ne serez pas en mesure d'avoir un seul jeu à la fin. Dans ce cas, vous pouvez utiliser cet algorithme pour tester la connectivité et de compter le nombre de composants dans un graphe. Le nombre de composants est le nombre de jeux que vous pouvez obtenir lorsque l'algorithme se termine.
Une éventuelle graphique (pour l'arbre ci-dessus):
OriginalL'auteur Adrian
Dijkstra est exagéré!!
Utilisez simplement la largeur de la première recherche à partir d'Une recherche pour le nœud que vous souhaitez atteindre. Si vous ne pouvez pas le trouver, il n'est pas connecté. La complexité est O(nm) pour chaque recherche, qui est à moins de Dijkstra.
Liée en quelque sorte, c'est le maximum de flux/min-cut problème. Le chercher, il peut être utile de votre problème.
OriginalL'auteur rutger
Je vois que vous avez eu votre réponse, c'est certainement pas NP-Complet, et c'est une très vieille question.
Cependant, je vais proposer une autre approche pour examiner le problème. Vous pourriez utiliser des ensembles disjoints pour cela. Dans la plupart des cas, pour le scénario, l'approche permettra de mieux que de faire un graphique de la traversée (Qui comprend constante de temps pour une grande partie des tests). Cependant, la construction du graphe peut prendre une bonne quantité de temps, si l'union par rang ou le chemin de compression est utilisé.
Vous pouvez lire à propos de la Structure de Données ici.
OriginalL'auteur metamemelord
Tout graphe plus court chemin algorithme va être exagéré si tous vous avez besoin est de trouver si un nœud est connecté à un autre. Une bonne bibliothèque Java qui accomplit qui est JGraphT. Son utilisation est assez simple, voici un exemple d'un Entier graphique:
Cette lib vous propose également tous les algorithmes de plus courts chemins.
OriginalL'auteur cristianoms