Algo qui retourne tous les cycles d'un graphe non orienté
Fermé
ap3
Messages postés
215
Date d'inscription
mercredi 13 janvier 2010
Statut
Membre
Dernière intervention
10 mars 2021
-
18 nov. 2017 à 14:01
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 18 nov. 2017 à 17:21
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 18 nov. 2017 à 17:21
A voir également:
- Quelles sont les 2 orientations possibles d'une page d’un document numérique ?
- Changer l'orientation d'une page dans un document Word - Guide
- Supprimer une page word - Guide
- Word numéro de page 1/2 - Guide
- Pavé numérique bloqué - Guide
- Signer un document word - Guide
5 réponses
yg_be
Messages postés
23412
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 décembre 2024
Ambassadeur
1 557
18 nov. 2017 à 15:02
18 nov. 2017 à 15:02
les résultats sont-ils trop nombreux, trop peu nombreux, pas corrects, ?
ap3
Messages postés
215
Date d'inscription
mercredi 13 janvier 2010
Statut
Membre
Dernière intervention
10 mars 2021
10
18 nov. 2017 à 15:03
18 nov. 2017 à 15:03
Ils sont pas corrects. Au niveau du nombre je pense qu'il n'y en pas assez.
Les résultats ne sont pas tous de la bonne taille.
Les résultats ne sont pas tous de la bonne taille.
yg_be
Messages postés
23412
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 décembre 2024
1 557
Modifié le 18 nov. 2017 à 15:58
Modifié le 18 nov. 2017 à 15:58
je pense que l'algorithme est fondamentalement incorrect. je suggère de décrire l'algorithme et de le programmer ensuite.
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
18 nov. 2017 à 16:35
18 nov. 2017 à 16:35
Bonjour,
Si on reprends juste la première condition :
Cela signifie qu'un graphe avec un seul nœud possède un cycle composé de ce seul nœud... Déjà ça c'est faux. Pour avoir un cycle il faudrait au moins 3 nœuds et 3 arcs : A-B, B-C, C-A. D'ailleurs dans cette configuration est-ce que tu considères que A-B-C est le même cycle que B-C-A et C-A-B ou tu les comptes 3 fois ? Peut-être même 6 fois avec C-B-A, B-A-C et A-C-B ?
Si on reprends juste la première condition :
if (noeuds.size() == 1) { Parcours p = new Parcours(); p.add(noeuds.get(0)); result.add(p); return result; }
Cela signifie qu'un graphe avec un seul nœud possède un cycle composé de ce seul nœud... Déjà ça c'est faux. Pour avoir un cycle il faudrait au moins 3 nœuds et 3 arcs : A-B, B-C, C-A. D'ailleurs dans cette configuration est-ce que tu considères que A-B-C est le même cycle que B-C-A et C-A-B ou tu les comptes 3 fois ? Peut-être même 6 fois avec C-B-A, B-A-C et A-C-B ?
yg_be
Messages postés
23412
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
28 décembre 2024
Ambassadeur
1 557
Modifié le 18 nov. 2017 à 17:11
Modifié le 18 nov. 2017 à 17:11
cela me semble une très bonne idée de le faire par récursivité.
cependant, je ne pense pas que tu puisses utiliser la fonction principale comme fonction récursive. tu dois plutôt définir une autre fonction qui, elle, sera récursive.
l'idée de marquer les nœuds parcourus peut fonctionner, mais n'est pas très élégante.
je pense qu'il est indispensable de passer à la fonction récursive le noeud de départ et le noeud d'arrivée.
cependant, je ne pense pas que tu puisses utiliser la fonction principale comme fonction récursive. tu dois plutôt définir une autre fonction qui, elle, sera récursive.
l'idée de marquer les nœuds parcourus peut fonctionner, mais n'est pas très élégante.
je pense qu'il est indispensable de passer à la fonction récursive le noeud de départ et le noeud d'arrivée.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
Modifié le 18 nov. 2017 à 17:25
Modifié le 18 nov. 2017 à 17:25
Voici une manière de faire.
PS. Comme je ne sais pas ce que contiennent exactement les classes Parcours et Noeud j'ai fait les miennes en partant des méthodes que tu utilisais déjà (même si ça me chagrine que ce soit les noeuds qui portent leurs propres voisins et qu'il n'y ait aucune notion de graphe là dedans).
PS. Comme je ne sais pas ce que contiennent exactement les classes Parcours et Noeud j'ai fait les miennes en partant des méthodes que tu utilisais déjà (même si ça me chagrine que ce soit les noeuds qui portent leurs propres voisins et qu'il n'y ait aucune notion de graphe là dedans).
import java.util.ArrayList; import java.util.Arrays; import java.util.List; class Parcours extends ArrayList<Noeud> { public Parcours(Parcours parcours) { super(parcours); } public Parcours() { super(); } } class Noeud { String id; Noeud[] voisins; public Noeud(String id) { this.id = id; } public Noeud[] getVoisins() { return voisins; } public void setVoisins(Noeud... voisins) { this.voisins = voisins; } @Override public boolean equals(Object obj) { return id.equals(((Noeud) obj).id); } @Override public String toString() { return id; } } public class Cycles { public static List<Parcours> listeCycles(List<Noeud> noeuds) { List<Parcours> parcours = new ArrayList<Parcours>(); for (Noeud noeud : noeuds) { Parcours debutParcours = new Parcours(); debutParcours.add(noeud); trouverCycle(parcours, debutParcours, noeud, noeud); } return parcours; } private static void trouverCycle(List<Parcours> parcoursNoeud, Parcours debutParcours, Noeud racine, Noeud courant) { for (Noeud voisin : courant.getVoisins()) { if (voisin.equals(racine)) { // on revient au départ if (debutParcours.size() > 2) { // on a un cycle Parcours parcours = new Parcours(debutParcours); parcours.add(voisin); parcoursNoeud.add(parcours); } continue; } if (debutParcours.contains(voisin)) {// déjà fait continue; } Parcours suiteParcours = new Parcours(debutParcours); suiteParcours.add(voisin); trouverCycle(parcoursNoeud, suiteParcours, racine, voisin); } } public static void main(String[] args) { Noeud a = new Noeud("A"); Noeud b = new Noeud("B"); Noeud c = new Noeud("C"); Noeud d = new Noeud("D"); Noeud e = new Noeud("E"); Noeud f = new Noeud("F"); a.setVoisins(b, d); b.setVoisins(a, c, d); c.setVoisins(b, e, f); d.setVoisins(a, b, e); e.setVoisins(c, d); f.setVoisins(c); System.out.println(listeCycles(Arrays.asList(a, b, c, d, e, f))); } }La confiance n'exclut pas le contrôle