2009-12-06 7 views
4

Comment créer un graphe pondéré C++ où chaque sommet du graphe a un poids (une valeur entière)?C++ Création d'un graphique pondéré?

Vous pouvez télécharger mon projet graphique here (Rapidshare):

Voici la fonction pour créer un graphique à partir des données de graphique stockées dans un fichier texte:

void GraphType::createGraph() 
{ 
    ifstream infile; 
    char fileName[50]; 

    int index; 
    int vertex; 
    int adjacentVertex; 

    if(gSize != 0) 
     clearGraph(); 

    cout << "Enter input file name: "; 
    cin >> fileName; 
    cout << endl; 

    infile.open(fileName); 

    if(!infile) 
    { 
      cout << "Cannot open input file." << endl; 
      return; 
    } 

    infile >> gSize; 

    graph = new UnorderedLinkList[gSize]; 

    for(index = 0; index < gSize; index++) 
    { 
      infile >> vertex; 
      infile >> adjacentVertex; 

      while(adjacentVertex != -999) 
      { 
       graph[ vertex ].insertLast(adjacentVertex); 
       infile >> adjacentVertex; 
      } 
    } 
    infile.close(); 
} 

Et voici les données Graphique (= nombre de sommets 10, le sommet de 0 à 9 et les sommets adjacents) d'entrée de fichier texte "Network2.txt":

0 1 2 9 -999

1 0 2 -999

2 0 1 9 8 3 -999

3 2 8 5 -999

4 3 8 6 5 -999

5 4 6 7 -999

6 4 7 8 -999

7 8 6 5 -999

8 9 2 3 4 6 7 -999

9 0 2 8 -999

Ma question est, Comment attribuer une valeur unique ou en poids de sommets 0 à 9? Toute aide sera vraiment appréciée. Merci d'avance!

+1

Ne pas annuler et laisser le balisage brisé. –

+0

Ok, merci gf, je vais prendre note de cela – Anthony

Répondre

2

Dans votre liste d'adjacences, au lieu de la stocker uniquement les index du nœud adjacent, faites-lui stocker une structure contenant les index du nœud adjacent et une valeur pour le tronçon connectant ces nœuds.

+0

Merci Nali4Freedom pour répondre. Votre réponse semble très intéressante. Cependant, après quelques réflexions, je ne suis toujours pas sûr de savoir comment le mettre en œuvre dans mon projet. Dites-moi si je suis loin de votre solution avec ce code ci-dessous: structure Vertex { int numVertices; int vertex; int adjacentVertices []; poids int. }; int main() { Vertex v0; v0.vertex = 0; v0.adjacentVertices [0] = 1; v0.adjacentVertices [1] = 2; v0.adjacentVertices [2] = 9; v0.poids = 19; Vertex v1; // ... système ("pause"); } – Anthony

+0

Ce code semble donner des poids à des verticies, et non des arêtes entre des verticies. Je pensais ceci: http://pastebin.com/m1f8ca859 qui est un changement beaucoup plus simple à votre code. De cette façon, chaque bord a son propre poids. Je viens de mettre tous les poids à 1 dans cet exemple, vous voudrez probablement les obtenir à partir du fichier d'entrée. –

5

Le Boost Graph Library (BGL) offre le type MutablePropertyGraph, dans lequel chaque arête et sommet peuvent stocker un poids en tant que propriété. Voir le example here, qui construit un graphique dirigé avec des bords pondérés.

+0

Merci beaucoup de m'avoir rappelé que j'ai besoin de commencer à apprendre et à utiliser la bibliothèque Boost. Je le télécharge au moment où j'écris ceci et je suis impatient d'essayer le MutablePropertyGraph. Malheureusement, pour cet exercice de classe, je dois créer le graphique et toutes ses fonctions à partir de zéro! Mais merci pour le lien très utile! – Anthony

Questions connexes