Exemple de Graphe orienté et Tri Topologique Code
Ce que quelqu'un sait où je peux obtenir un échantillon de la mise en œuvre d'un Graphe orienté et un exemple de code pour effectuer un tri topologique sur un graphe orienté? (de préférence en Java)
- J'ai codé cette mise en œuvre jusqu'il y a quelques semaines. C'est en Java et utilise un custom graphe orienté de la classe. Nous espérons que les commentaires sont utiles!
- la chose drôle est que si la même question était posée maintenant, il aurait été downvoted et fermé. Et les gens ont fait des commentaires demandant
what have your tried so far
. - fermés que pas constructif. Pour l'instant, cette question n'est pas un bon ajustement pour notre Q&Un format. Nous attendons des réponses à être étayée par des faits, des références, ou de l'expertise, mais cette question sera susceptible de solliciter le débat, les arguments, les bureaux de vote, ou de longues discussions. Si vous sentez que cette question peut être améliorée et, éventuellement, rouvert, visitez le centre d'aide et de conseils. ========================================================== C'est juste une blague. Bien sûr, je l'ai trouvé extrêmement utile.
Vous devez vous connecter pour publier un commentaire.
Ici est une simple mise en œuvre de la première algorithme de la Page Wikipedia sur le Tri Topologique:
Une mise en œuvre que j'ai réalisée sur la deuxième alternative sur la page wikipédia:
http://en.wikipedia.org/wiki/Topological_sorting
Vous pouvez également utiliser un tiers des projets open source, comme JGraphT. Il fournit de nombreux simple et compliqué graphique des structures et de leur représentation visuelle. Aussi, vous n'avez pas à traiter avec les problèmes structurels de cette façon.
Voici une mise en œuvre je l'ai fait il y a quelques temps:
Et voici un exemple d'utilisation:
Deux fonctionnalités supplémentaires (ou de complications) dans mon code:
J'avais besoin de l'appui des boucles (cycles) dans mon cas, de sorte que si le graphe a boucles il fait quelques "best-effort" de la commande. Ce comportement est contrôlé par un drapeau passé au constructeur. Dans tous les cas, vous pouvez (devez) faire appel
hadLoops()
pour demander si il y avait des cycles détectés.En plus, je voulais l'algorithme de tri à préférer l'original de la commande dans le cas de la liberté.
D'accord avec jeremy.
Je pense que c'est ici une mise en œuvre pour obtenir le hashcode basée sur l'efficacité de Java:
http://www.javapractices.com/topic/TopicAction.do?Id=28
Comment ajouter ci-dessous la méthode pour remplacer le hashcode?
Juste pour compléter l'excellente solution par @templatetypedef un peu, j'ai ajouté quelques tests unitaires à donner de la confiance pour moi et pour les autres à utiliser. Espérons que cela aide...
Vous avez besoin de remplacer
hashCode()
de la fonction en tant que bien puisque vous utilisezHashSet
dans les bords.Autrement, il va soulever des bugs.
EXP: Ajouter deux instances à même de et à dans le
hashset
. Le 2ème ne sera pas overritten sanshashCode()
qui il est censé être remplacé.