IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Matrice Graphe C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut Matrice Graphe C++
    salut

    j'ai besoin d’implémenter une matrice qui représente un graphe. j'utilise la notion du vector : vector<vector<type> > matriceGraphe. Mais, je me trouve devant le problème suivant :

    Mon graphe est composé d'un ensemble des nœuds de différents type ainsi qu'un ensemble des arcs de différents types (en fait chaque type nœud ou arc est une classe ) donc le problème comment déclarer ça ?
    Images attachées Images attachées  

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Si tes classes (nœud et arc) fournissent respectivement les mêmes services (c'est-à-dire qu'elles ont respectivement la même interface), tu peux utiliser le polymorphisme (d'inclusion).
    (Attention avec la classe std::vector et l'héritage, le plus "simple" et de stocker des std::vector<std::shared_ptr<T>> ou des std::vector<std::unique_ptr<T>> selon l'usage)
    FAQ C++ - Héritage

    Si ce n'est pas le cas, tu peux créer un type qui contient tous les types possibles et faire les tests qui vont bien pour savoir lequel utiliser (?) (On peut peut être utiliser une union (?)). Mais cette solution est à éviter.

  3. #3
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut
    Merci pour la réponse mais je ne parle d'héritage ici. La difficulté pour moi est le type des nœuds et des arcs : les nœuds du graphe ont un type complexe(classe) différent du type des arcs (aussi classe). En fait, le graphe est composé des instances de la classe Nœud (Nœud.h) et les arc sont des instances de la classe Arc (Arc.h). Aidez moi comment je peux implémenter ça?

    Si j'utilise l'imbrication des vecteurs pour implémenter la matrice (i.e vector<vector> ), est ce je peux donner pour chaque vecteur un type différent?

  4. #4
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par kochfet Voir le message
    Si j'utilise l'imbrication des vecteurs pour implémenter la matrice (i.e vector<vector> ), est ce je peux donner pour chaque vecteur un type différent?
    Non, c'est std::vector<std::vector<T>>.
    Il existe les tuple qui permettrait de faire std::tuple<std::vector<T>, std::vector<U>, std::vector<V>, ...> mais je ne pense pas que ce soit que tu veux faire.

    J'ai du mal à comprendre ton problème, qu'est-ce qui ne va pas avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class noeud
    {
        T value;
        std::pair<noeud, int> arcs; // Les arcs mènent à un noeud et ont un poids
    };
     
    std::vector<noeud> graphe;

  5. #5
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut
    la classe Nœud et la classe Arc sont indépendantes. Le graphe à construire a pour sommets des instances de la classe Nœud et pour arcs des instances de la classe Arc. La matrice correspondante est donnée dans la figure ci-joint.
    (N1,N2, N3 sont de type Noeud et Arc1, Arc2 et Arc3 sont de type Arc)
    Images attachées Images attachées  

  6. #6
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par kochfet Voir le message
    (N1,N2, N3 sont de type Noeud et Arc1, Arc2 et Arc3 sont de type Arc)
    C'est plus le même problème que dans le premier message (?!)

    Citation Envoyé par kochfet Voir le message
    Mon graphe est composé d'un ensemble des nœuds de différents type ainsi qu'un ensemble des arcs de différents types (en fait chaque type nœud ou arc est une classe)
    Tu peux donc utiliser std::map<Noeud, std::map<Noeud, Arc>>

  7. #7
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut
    Merci pour votre réponse, je vais essayer ça

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Même si tu ne l'utilise pas, va jeter un œil du côté de boost.graph, les explications peuvent te donner des idées sur les possibilités d'implémentation.

  9. #9
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut
    svp
    j'ai rencontré une erreur dans la compilation de mon code :
    En fait, j'ai une classe classe A avec les deux constructeurs suivant:
    un constructeur par défaut : A(cout<<"par défaut")
    un constructeur paramétré : A(int a);
    aussi j'ai une classe B dérivée de A ( class B : public A). Cette classe possede aussi deux constructeurs :
    un constructeur par défaut : B()
    un constructeur paramétré : B(int b); Dans le fichier B.cpp
    j’écris B(int b) {A(a)} càd j'ai fait appel au constructeur paramétré de A puisqu'elle est sa classe mère.

    Dans le main j'instancie un objet de type B comme suit :
    B obj(4);
    j'essaye d'afficher le 4 mais il s'affiche par défaut c-a-d
    un appel du constructeur par défaut de A est appelé et pas le constructeur paramétré. Je veux savoir qu'elle est ma faute?

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Salut

    Il faut écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    B::B(int b) : A(b) 
    {
    }
    Et pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B::B(int b)
    {
      A(b);
    }
    Ta faute est que la ligne A(b); crée un objet temporaire de classe A qui est détruit immédiatement. Ca ne sert donc à rien. Tu viendrais pas du Java par hasard ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Graphe -> matrice
    Par etplus dans le forum 2D
    Réponses: 5
    Dernier message: 25/03/2009, 10h56
  2. Boucle parcourant une matrice [graphe]
    Par Linu6 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 15/08/2008, 01h24
  3. Construction d'un graphe étoilé à partir d'une matrice
    Par jyboo dans le forum Interfaces Graphiques en Java
    Réponses: 10
    Dernier message: 15/02/2008, 17h38
  4. Matrice d'adjacence et graphe
    Par xavhawk dans le forum Images
    Réponses: 4
    Dernier message: 19/10/2007, 09h11
  5. Théorie des graphes : Représentation GRAPHIQUE d'une matrice d'adjacence
    Par jm_gouy dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 03/05/2006, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo