#include #include #include #include #include s #define dim 1000 using namespace std; const int MAX_N = 10000; const int MAX_M = 10000; const int MAX_Q = 100; int graph[MAX_N][MAX_N]; int N = 0,M,Q; void stampaMatrice(){ for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ cerr << graph[i][j] << " "; } cerr << endl; } } /* Trova il vertice con il valore di chiave minimo tra quelli non ancora inclusi */ int minKey(int key[], bool mstSet[]){ int min = INT_MAX, min_index; for(int v = 0; v < N; v++) if(mstSet[v] == false && key[v] < min) min = key[v],min_index = v; return min_index; } /* Procedura MST */ void primMST(){ int parent[N]; int key[N]; bool mstSet[N]; for(int i = 0; i < N; i++){ key[i] = INT_MAX; mstSet[i] = false; } key[0] = 0; parent[0] = -1; for(int count = 0; count < N-1; count++){ int u = minKey(key,mstSet); mstSet[u] = true; /* graph [u][v] è non zero solo per i vertici adiacenti ad altri * mstSet[v] è falso per vertici non ancora inclusi in MST * eseguiamo un update della chiave solo se graph[u][v] è piu piccolo *della chiave key[v] */ for(int v = 0; v < N; v++) if(graph[u][v] && mstSet[v] == false && graph[u][v] < key[v]) parent[v] = u, key[v] = graph[u][v]; } int peso = 0; /*for(int i = 0; i < N-1; i++){ peso += graph[i][parent[i]]; } /* for(int i = 0; i < N; i++){ cerr << " " << parent[i]; } cerr << endl; cerr << "\n Peso: " << peso;*/ ofstream fout("output.txt"); assert( fout ); fout << peso << endl; fout.close(); } int main() { ifstream fin("input.txt"); assert( fin ); fin >> N >> M >> Q; int a = 0, b = 0, val =0; for(int i = 0; i < M; i++){ fin >> a >> b >> val; graph[a][b] = val; graph[b][a] = val; } primMST(); // stampaMatrice(); return 0; }