#define NDEBUG // NDEBUG definita nella versione che consegno #include #include #include #include #include using namespace std; int n; // nodi int m; // archi int q; // numero di query int u; int v; int w; const int MAX_NODES = 10000; int nodeSet[MAX_NODES + 1]; typedef pair, unsigned long long int> Edge; bool compareEdgeWeight(Edge a, Edge b) { return a.second < b.second; } // Usa un multiset (e non un semplice set) perché in caso contrario // non si considerano gli archi con peso analogo! multiset edges(&compareEdgeWeight); bool allNodesInSameSet() { for (int i = 1; i <= n; ++i) { if (nodeSet[i] != -1) { for (int j = i + 1; i <= n; ++i) { if (nodeSet[i] != nodeSet[j]) { return false; } } return true; } } return true; } int main() { unsigned long long int maxWeight = 0; multiset::iterator it; #ifdef NDEBUG ifstream fin("input.txt"); assert( fin ); ofstream fout("output.txt"); #else istream &fin(cin); ostream &fout(cout); #endif fin >> n; fin >> m; fin >> q; for (int i = 1; i <= n; ++i) { nodeSet[i] = -1; // Nodo isolato } for (int i = 0; i < m; ++i) { fin >> u; fin >> v; fin >> w; edges.insert(make_pair(make_pair(u, v), w)); nodeSet[u] = u; nodeSet[v] = v; } while (!allNodesInSameSet()) { // L'ordinamento per peso è già svolto dal multiset (in più dato che // rimuovo gli archi di costo minimo mantengo sempre l'insieme // ordinato). it = edges.begin(); Edge e = *it; edges.erase(it); // Se i set sono diversi, aggiornali ("ricorsivamente!") e aggiungi // l'arco all'MST int oldSet = nodeSet[e.first.first]; int newSet = nodeSet[e.first.second]; if (oldSet != newSet) { for (int i = 1; i <= n; ++i) { if (nodeSet[i] == oldSet) { nodeSet[i] = newSet; } } maxWeight += e.second; } } fout << maxWeight << endl; // FIXME Archi return 0; }