Pagini recente » Cod sursa (job #1153125) | Cod sursa (job #1061706) | Cod sursa (job #1259241) | Cod sursa (job #1556417) | Cod sursa (job #1704106)
#include <iostream>
#include <stdio.h>
#include <queue>
#include <stdlib.h>
#include <algorithm>
#include <vector>
struct Compare
{
bool operator() (std::pair< std::pair<int, int>, int > const& a, std::pair< std::pair<int, int>, int > const &b) const {
return a.second > b.second;
}
};
std::vector<int> parent, rank;
int FindSet(int a) {
if (a != parent[a]) {
parent[a] = FindSet(parent[a]);
}
return parent[a];
}
void Union(int a, int b) {
int aParent, bParent;
aParent = FindSet(a);
bParent = FindSet(b);
if (rank[aParent] > rank[bParent]) {
parent[bParent] = aParent;
} else if (rank[aParent] < rank[bParent]){
parent[aParent] = bParent;
} else {
parent[aParent] = bParent;
rank[bParent]++;
}
}
int main() {
FILE *in = fopen("apm.in", "r");
FILE *out = fopen("apm.out", "w");
int N, M;
fscanf(in, "%d %d", &N, &M);
std::vector<std::pair<int, int> > resultVect;
std::priority_queue<std::pair<std::pair<int, int>, int>, std::vector<std::pair<std::pair<int, int>, int> >, Compare> priorQueue;
for (int i = 0; i < M; i++) {
int x, y, c;
fscanf(in, "%d %d %d", &x, &y, &c);
priorQueue.push(std::make_pair(std::make_pair(x - 1, y - 1), c));
}
for (int i = 0 ; i < N; i++) {
parent.push_back(i);
rank.push_back(i);
}
int bestPlanCost = 0;
for (int i = 0; i < M; i++) {
int node1, node2, edgeCost;
node1 = priorQueue.top().first.first;
node2 = priorQueue.top().first.second;
edgeCost = priorQueue.top().second;
priorQueue.pop();
if (FindSet(node1) != FindSet(node2)) {
Union(node1, node2);
bestPlanCost += edgeCost;
resultVect.push_back(std::make_pair(node1, node2));
}
}
int size = resultVect.size();
fprintf(out, "%d\n", bestPlanCost);
fprintf(out, "%d\n", size);
for (uint i = 0; i < resultVect.size(); i++) {
fprintf(out, "%d %d\n", resultVect[i].first + 1, resultVect[i].second + 1);
}
return 0;
}