#include #include //#include using namespace std; /*Massimo numero di nodi*/ const int MAX_N = 10000; /*Massimo numero di archi*/ const int MAX_M = 1000000; /*Dimensioni*/ int n, m; /*Grafo*/ int tree[MAX_M][4]; /*Matrice del percorso*/ int matrix[MAX_N][MAX_N]; /*Tengo traccia dei nodi già considerati*/ int vect[MAX_N]; /*Metodi*/ void readFile(); void sort(); void kruscal(); int searchnode(int n); int main(){ readFile(); sort(); kruscal(); } /*Lettura del file di input*/ void readFile(){ ifstream fin("input.txt"); assert( fin ); fin >> n >> m; for(int i = 1; i <= m; i++){ fin >> tree[i][1]; fin >> tree[i][2]; fin >> tree[i][3]; } fin.close(); } /*Ordinamento BubbleSort per Pesi*/ void sort(){ for(int i=1;i<=m-1;i++){ for(int j=1;j<=m-i;j++){ if(tree[j][3]>tree[j+1][3]){ int temp=tree[j][1]; tree[j][1]=tree[j+1][1]; tree[j+1][1]=temp; temp=tree[j][2]; tree[j][2]=tree[j+1][2]; tree[j+1][2]=temp; temp=tree[j][3]; tree[j][3]=tree[j+1][3]; tree[j+1][3]=temp; } } } } /*Algoritmo di Kruscal*/ void kruscal(){ /*Variabile per il conteggio dei pesi*/ int weight=0; /*Stream output*/ ofstream fout("output.txt"); /*Tanti quanti i nodi*/ for(int i=1;i<=n;i++){ matrix[i][1]=i; vect[i]=1; } /*Per ogni arco*/ for(int i=1;i<=m;i++){ int node1=searchnode(tree[i][1]); int node2=searchnode(tree[i][2]); if(node1!=node2){ fout << tree[i][1] << " "<< tree[i][2] << '\n'; weight=weight + tree[i][3]; /*Mixo le due colonne*/ for(int j=1;j<=vect[node2];j++){ vect[node1]++; matrix[node1][vect[node1]]=matrix[node2][j]; } /*Ho già considerato il nodo*/ vect[node2]=0; } } fout << weight; fout << endl; fout.close(); } /*Ricerca del prossimo nodo dalla matrice*/ int searchnode(int n){ for(int i=1;i<=m;i++){ for(int j=1;j<=vect[i];j++){ if(n==matrix[i][j]) return i; } } return -1; }