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 :

Structure de graphe en C++


Sujet :

C++

  1. #1
    Membre �clair� Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par d�faut Structure de graphe en C++
    Bonjour,

    J'ai une une liste de points stock�s dans une liste Vector, en fait j'ai plusieurs liste de points, chaque liste d�crit un chemin, je souhaiterais transformer ces liste en un seul graphe (structure de donn�e de type graphe) qui contient mes points comme n�ud et les n�uds attach�s � ce n�ud comme n�uds fils ?

    j'ai vu rapidement Boost sur ce site, mais je pense que c'est assez compliqu� pour ce que je veux faire ! car en fait moi je veux juste cr�er le graphe et le parcourir c'est tout ?

    auriez vous une piste pour le faire ?
    merci pour votre aide

  2. #2
    Membre tr�s actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    243
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 243
    Par d�faut
    Pour la structure, quelque chose comme :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class GraphNode
    {
        [...]
     
        // fonction parcourir
     
        [...]
     
        std::vector<GraphNode*> edges;
     
        Point pos; // si besoin
     
    };
    Pour la conversion vers cette structure, une map<Point, GraphNode*> pour retrouver l'adresse des n�uds correspondants � ins�rer dans la liste des ar�tes du n�ud pr�c�dent devrait suffire.

  3. #3
    Membre �m�rite
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    D�tails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par d�faut
    Bonsoir,

    @ralf91, Je t'avoue que j'ai trouv� les graphes boost tr�s d�stabilisant au d�but, mais je pense qu'ils m�ritent d'�tre �tudi�s si tu te mets � faire du traitement de graphe.

    Le plus dur consiste � choisir la structure adapt�e � ton probl�me (les diff�rents param�tres de adjacency_list http://www.boost.org/doc/libs/1_47_0...ing-graph-type) et � comprendre que la structure influence les fonctionnalit�s disponibles.

    Comme souvent dans boost, il manque une "facade" pour les besoins simples o� l'on veut que �a marche, m�me de fa�on sous-optimale (un peu comme std::find sur un vecteur).

    j'ai vu rapidement Boost sur ce site, mais je pense que c'est assez compliqu� pour ce que je veux faire ! car en fait moi je veux juste cr�er le graphe et le parcourir c'est tout ?
    Le fait est que tu vas vite vouloir parcourir les arcs sortant d'un sommet sans parcourir la liste compl�te des arcs, associer des informations aux sommets et aux arcs, etc... D'o� l'int�r�t d'apprendre � se servir de boost::graph plut�t que de passer 3 fois plus de temps � monter ta propre structure.


    PS :
    - ZiGoM@r ton graphe ressemble beaucoup � un arbre. En outre, il est impossible d'associer la moindre information aux arcs/arr�tes du graphe. Ensuite, niveau parcours, il manque un truc.
    - La fa�on la plus simple de repr�senter un graphe dans le "cas g�n�ral" (arcs parall�les, orient� ou non, ...) consiste � g�rer une liste d'arcs mat�rialis�s par un sommet source et un sommet cible. Ca marche plut�t bien en BDD o� l'on peut indexer la source et la cible... Pour le reste, la recherche des arcs incidents � un sommet est lente.

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Secteur : Sant�

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par d�faut
    Bonjour

    Quelques notes permettant d'utiliser boost.graph (version simple et g�n�raliste, donc pas optimis�e en fonction d'une probl�matique sp�cifique) :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #include <boost/graph/adjacency_list.hpp>
     
    // Les structures qui contiennent les informations sur les vertices, edges et graph
    struct EdgeProperties { std::string name; unsigned id; };
    struct VertexProperties { ... };
    struct GraphProperties { ... };
     
    // un graph générique
    typedef boost::adjacency_list 
       <boost::vecS, boost::vecS, boost::bidirectionalS,
       boost::property<boost::vertex_bundle_t, VertexProperties>,  // vertex properties
       boost::property<boost::edge_bundle_t, EdgeProperties>,  // edges properties
       boost::no_property  // graph properties (pas de propriétés pour le graph ici mais on pourrait utiliser GraphProperties aussi)
    > Graph;
     
    Graph  g;
     
    // Ajout vertex
    const Graph::vertex_descriptor v1 = boost::add_vertex(VertexProperties(...), g);
    // Accès à un vertex
    VertexProperties& properties = get(boost::vertex_bundle, g)[v1];
     
    // Création d'un edge
    const std::pair<Graph::edge_descriptor, bool> e1 = boost::add_edge(v1, v2, EdgeProperties{...}, g);
    // Accès à un edge
    if (e1.second)
       get(boost::edge_bundle, g)[e1.first] = EdgaData{"Edge 1", 5};
     
    // Récupérer tous les vertices
    std::pair<vertex_iterator_t, vertex_iterator_t> iterators = boost::vertices(g);
    // Nombre de vertices
    boost::graph_traits<Graph>::vertices_size_type s = num_vertices(g);
     
    // Récupérer tous les edges
    std::pair<edge_iterator_t, edge_iterator_t> iterators = boost::edges(g);
    // Récupérer les edges partant d'un vertex
    std::pair<out_edge_iterator_t, out_edge_iterator_t> iterators = boost::out_edges(v1, g);
    // Récupérer les edges arrivant sur un vertex
    std::pair<in_edge_iterator_t, in_edge_iterator_t> iterators = boost::in_edges(v1, g);
    // récupérer les vertices adjacent à un vertex
    std::pair<adjacency_iterator_t, adjacency_iterator_t> iterators = = adjacent_vertices(v1, g);
    // récupérer un vertex a partir d'un edge
    Graph::vertex_descriptor v1 = boost::source(e1.first, g);
    Graph::vertex_descriptor v2 = boost::target(e1.first, g);
    Avec cela, tu as les fonctions de base pour manipuler les graph de boost. Ensuite, tu utilises les it�rateurs fournis avec les algorithmes standards de la STL.

    Par contre, m�me si le code que j'ai donn� est relativement simple, il est bien sur pr�f�rable d'apprendre correctement boost.graph (il existe un livre sp�cifiquement pour cette biblioth�que : The Boost Graph Library - User Guide and Reference Manual, de Jeremy Siek)

  5. #5
    Membre �m�rite
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    D�tails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par d�faut
    Bonjour,

    Bonne initiative gbdivers, j'avais la flemme

    Sinon, voir dans boost/libs/graph/example.

  6. #6
    Membre �clair� Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par d�faut
    Bonjour,

    Merci pour vos r�ponses,
    Je n'ai pas besoin de nommer ni les sommets ni les aretes, en effet, j'ai une liste de points, deux points de la liste qui sont dans deux cases successives doivent etre "reli�s", je vais l'expliquer � travers un exemple c'est plus simple :
    Soit la liste :

    p1 p2 p3 p4 p5

    cela veut dire que p1 a p2 comme fils (voisins) p2 a p1 et p3 comme voisins, p3 a p2 et p4 etc.

    c'est tout ce que je veux faire, ensuite, je dois bien-sur pouvoir le parcourir ! vous pensez que c'est vraiment plus rapide de passer par boost::Graph ?

  7. #7
    Membre �m�rite
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    D�tails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par d�faut
    Bonjour,

    Est-ce que tu reconnais deux points identiques au sein de deux listes de points?

    p1 p2 p3 p4 p5
    p6 p2 p7 p8 p1

    Tu veux faire quels genres de parcours?

  8. #8
    Membre �clair� Avatar de ralf91
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    419
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 419
    Par d�faut
    oui, j'ai presque dans tous les cas un point d'une liste qui apparait dans une autre liste pour que le tout soit connexe.

    Pour le parcours j'ai pens� � ajouter un attribut "marqueur" pour indiqu� si je suis d�j� pass� par ce n�ud ou pas.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 28/08/2009, 08h49
  2. R�ponses: 3
    Dernier message: 17/03/2009, 11h41
  3. Probleme de structure d'un graphe
    Par Aurelienjjj dans le forum C
    R�ponses: 11
    Dernier message: 20/11/2006, 16h41
  4. [GRAPHES ?] Structure pour stocker des rectangles
    Par 10_GOTO_10 dans le forum Algorithmes et structures de donn�es
    R�ponses: 5
    Dernier message: 13/07/2006, 21h15

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