[C++] Stampa in ordine crescente della struttura di un grafo

xjokerx

Nuovo Utente
145
5
CPU
Intel Core I5-3570k 3.40Ghz + Hyper 412s
Scheda Madre
Asrock Z77 Extreme 4
Hard Disk
WD Black 1 TB 7200rpm
RAM
Kingston 8 Gb 1600
Scheda Video
Sapphire r9 280 3gb
Scheda Audio
Integrato
Alimentatore
Corsair CX600M
Case
Cooler Master HAF 912 Plus
Sistema Operativo
Windows 7 ultimate 64-bit
Salve a tutti, vi scrivo per quanto riguarda un problema che ho con un esercizio sui grafi; immagino che dal titolo possa risultare poco chiaro quindi vi posto uno screenshot dell'esercizio:
Schermata 2020-05-22 alle 12.55.11.png


Ora, io riesco a stampare l'output nel formato richiesto ma non riesco a metterli in ordine crescente.. Vi lascio anche il mio codice:

C++:
#include <iostream>
#include <fstream>
using namespace std;

#define MAXN 100

//rappresentazione del grafo attraverso la matrice di adiacenza
template <class T> class Graph {
private:
    bool **adj; //adj[MAXN][MAXN];
    int n, m, current;
    T** k; // k[i] -> key se i è l'id della chiave key
    
    int _search(T key) {
        for(int i=0; i<n; i++) {
            if( *k[i] == key ) return i;
        }
        return -1;
    }
    
public:
    Graph() {
        n = m = 0;
        adj = new bool*[MAXN];
        for(int i=0; i<MAXN; i++)
            adj[i] = new bool[MAXN];
        k = new T*[MAXN];
        for(int i=0; i<MAXN; i++) k[i] = NULL;
        current = 0;
    }
    
    Graph<T>& addNode(T key) {
        // inseriamo il nodo all'interno dell'array k
        k[n] = new T(key);
        n++;
        // aggiorniamo la matrice di adiacenza
        for(int i=0; i<n; i++) adj[n][i] = adj[i][n] = 0;
        return *this;
    }
    Graph<T>& addEdge(T key1, T key2) {
        int i = _search(key1);
        int j = _search(key2);
        if(i<0 || j<0) return *this;
        adj[i][j] = 1;
        
        m++;
        return *this;
    }
    void adjSet(T key, ostream& out) {
        int i = _search(key);
        if(i<0) return;
        
        for(int j=0; j<n; j++) {
            if(adj[i][j]==1) {
                out << "," << *k[j];
            }
        }
    }
    
    void selectionSort() {
        for (int i=0; i<n; i++) {
            int min = i;
            for (int j=i+1; j<n; j++) {
                if (k[j]<k[min])    min = j;
            }
            T *temp = k[min];
            k[min] = k[i];
            k[i] = temp;
        }
    }
    
    // iteratore
    void reset() {
        current = 0;
    }
    int hasNext() {
        return current<n;
    }
    T* next() {
        if(!hasNext()) return NULL;
        T* tmp = k[current];
        current++;
        return tmp;
    }
};


template <class H> ostream& operator<<(ostream& out, const Graph<H>& g) {
    Graph<H> tmp = g;
    tmp.reset();
    
    while(tmp.hasNext()) {
        H* e = tmp.next();
        
        out << "(" << *e;
        tmp.adjSet(*e, out);
        out << ") ";
      
    }
    return out;
}

int main() {
    ifstream in("input.txt");
    ofstream out("output.txt");
    int N, M;
    string tipo;
    char ch1, ch2, ch3;
    for (int task=0; task<100; task++) {
        in >> N >> M;
        in >> tipo;
        if (tipo=="int") {
            Graph<int> *g = new Graph<int>();
            int key;
            int K[N];
            int sorg, dest;
            for (int i=0; i<N; i++) {
                in >> key;
                g->addNode(key);
                K[i]=key;
            }
            g->selectionSort();
            for (int i=0; i<M; i++) {
                in >> ch1;
                in >> sorg;
                //in >> ch2;
                in >> dest;
                in >> ch3;
                g->addEdge(sorg, dest);
            }
            out << *g;
        }
        
        if (tipo=="double") {
            Graph<double> *g = new Graph<double>();
            double key;
            double K[N];
            double sorg, dest;
            for (int i=0; i<N; i++) {
                in >> key;
                g->addNode(key);
                K[i] = key;
            }
            g->selectionSort();
            for (int i=0; i<M; i++) {
                in >> ch1;
                in >> sorg;
                //in >> ch2;
                in >> dest;
                in >> ch3;
                g->addEdge(sorg, dest);
            }
            out << *g;
        }
        
        if (tipo=="char") {
            Graph<char> *g = new Graph<char>();
            char key;
            char K[N];
            char sorg, dest;
            for (int i=0; i<N; i++) {
                in >> key;
                g->addNode(key);
                K[i] = key;
            }
            g->selectionSort();
            for (int i=0; i<M; i++) {
                in >> ch1;
                in >> sorg;
                //in >> ch2;
                in >> dest;
                in >> ch3;
                g->addEdge(sorg, dest);
            }
            out << *g;
        }
        out << endl;
    }
    in.close();
    out.close();
}
Spero qualcuno di voi possa aiutarmi!
 

Entra

oppure Accedi utilizzando