2016-04-24 14 views
0

Grundsätzlich habe ich eine Adj_Matrix erzeugt und ich möchte eine Adj_Liste von der Adj_Matrix machen ... Allerdings bekomme ich immer einen Fehler, der sagt "Keine Übereinstimmung für Anruf ..." Ich versuchte es ohne aPair ich noch bekomme den gleichen Fehler Ich kann nicht herausfinden, was mein Problem ist. Kann mir jemand sagen, warum die Liste nicht funktioniert? die Liste ist ganz am Ende des CodesAdjazenzliste Fehler mit Liste

int **gen_random_graph(int n) 
{ 
    srand(time(0)); 
    int **adj_matrix = new int*[n]; 
    for(int i = 0; i < n; i++) 
    { 
     for (int j = i; j < n; j++) //generating a N x N matrix based on the # of vertex input 
     { 
      adj_matrix[i] = new int[n]; 
     } 
    } 

    for(int u = 0; u < n; u++) 
    { 
     for (int v = u; v < n; v++) 
     { 
      bool edgeOrNot = rand() % 2; //decide whether it has an edge or not 
      adj_matrix[u][v] = adj_matrix[v][u] = edgeOrNot; 
      if(adj_matrix[u][v] == true) 
      { 
       adj_matrix[v][u] = true; 
       if(u == v)       //We can't have i = j in an undirected graph so we set it to false 
       { 
        adj_matrix[u][v] = -1; 
       } 
      } 
      else          //if adj_matrix[u][v] is false set the symmetry to be false 
      { 
       adj_matrix[v][u] = adj_matrix[u][v] = -1; 
      } 
     } 

    } 
    for(int i = 0; i < n; i++) 
    { 
     for(int j = i; j < n; j++)   //create the N x N with edges and sets the weight between the edge randomly 
     { 
      if(adj_matrix[i][j] == true) 
      { 
        int weight = rand() % 10 + 1; 
        adj_matrix[i][j] = adj_matrix[j][i] = weight; 
        cout << " (" << i << "," << j << ") " << "weight: " << adj_matrix[i][j] << endl; 
      } 
     } 
    } 



for(int i = 0; i < n; i++) 
{ 
    vector<int> adj_list; 
    for(int j = i; j < n; j++) 
    { 
     if(adj_matrix[i][j] > 0) 
     { 
      int weight = adj_matrix[i][j]; 
      adj_list.push_back(j); 
      cout << adj_list[i] << " " << endl; 
     } 
    } 
} 
    print(n,adj_matrix); 
    return (adj_matrix); 
} 
+0

Kann adj_list aufgerufen werden? –

+0

umm Ich habe keine Funktion für adj_list gemacht, also nein, ich denke nicht, dass es aufgerufen werden kann. Im Grunde habe ich eine Adj_Matrix erzeugt und nun muss ich aus der AdjMatrix Adj_List erstellen – Darkflame

+0

hmmmm aber ich brauche nur das Gewicht von adj_matrix [i] [j] gibt es eine Möglichkeit, das zu beheben? – Darkflame

Antwort

2

Ich sehe, dass adj_list nicht aufrufbar ist, so dass Ihr Code ist gebrochen. Dafür gibt es ein paar einfache Lösungen. Wenn Sie these docs betrachten, können Sie einfach auf listObj.front() und listObj.back() zugreifen ODER Sie können auch einfach einen Iterator erstellen, indem Sie listObj.begin() verwenden und über die beiden Elemente iterieren (was wünschenswert sein kann, wenn Sie mehr als zwei Elemente in die Liste aufnehmen). Ein einfaches Beispiel zum Erstellen eines Iterators für eine Liste finden Sie unter this tutorial im Code-Snippet oberhalb der Zusammenfassung.

Beachten Sie, hier, Ihr Listenobjekt, das ich listObj für Einfachheit/Abstraktion nannte, wäre einfach adj_matrix[i][j] in dieser unteren Schleife. Das sollte Ihren Syntaxfehler beheben.

Auch, abgesehen von der Syntax Ihres Codes, verstehe ich nicht, warum Sie Gewichte zu einer Liste zu schieben versuchen, dann drucken Sie die Adjazenzmatrix aus und geben sie zurück. Ich verstehe auch nicht, warum Sie Listen von Paarobjekten verwenden würden, wenn es so aussieht, als ob Sie nur ganzzahlige Gewichte darauf schieben möchten. Dafür können Sie einen einfachen Vektor von Ganzzahlen verwenden (z. B. vector <int> adj_list;) ... oder noch einfacher, Sie könnten ein einfaches Array von Ganzzahlen verwenden ... anstatt einen Vektor von Listen von Paaren zu verwenden.

EDIT: Nachdem ich den Code lokal ausgeführt und die Werte betrachtet habe, erkannte ich das Problem in der OP-Ausgabe war einfach, dass er "wahr" in C++ anstelle einer Ganzzahl, die ein Erstellen war Fehler, wie in this SO post erläutert. Das OP hat auch eine weitere Entwurfsentscheidung zu treffen, wo Adjazenzlisten betroffen sind. Mehr darüber, was eine Adjazenzliste konzeptuell ist, wurde gefunden on Wikipedia.

+0

o das soll sein (j, Gewicht) Ich habe gerade getestet, ob es 1 Integer anstelle von 2 akzeptiert aber nicht funktioniert – Darkflame

+0

Oh, hast du es herausgefunden? Es sieht so aus, als ob es ziemlich einfach sein sollte. Aber lassen Sie mich wissen, wie es geht. – user3773048

+0

Nein, ich kann es ehrlich gesagt nicht herausfinden es halten givnig mir den gleichen Fehler, wenn ich Vektor < int > es stürzt dieses Mal tho – Darkflame

Verwandte Themen