Pagini recente » Cod sursa (job #268929) | Cod sursa (job #3138443) | Cod sursa (job #3187693) | Cod sursa (job #462588) | Cod sursa (job #2247710)
#include <bits/stdc++.h>
using namespace std;
vector <pair <pair <int, int>, int>> muchiiSortate;
vector <pair <int , int>> perechileDinGraff;
int radacina[1000001], numbersOfNodesInGraff[100001];
void initializare(int noduri){
for (int i = 1; i <= noduri; i++){
numbersOfNodesInGraff[i] = 1;
radacina[i] = i;
}
}
int rege(int nod){
int tata = nod, auxiliar;
while(radacina[tata] != tata){
tata = radacina[tata];
}
while(radacina[nod] != nod){
auxiliar = radacina[nod];
radacina[nod] = tata;
nod = auxiliar;
}
return tata;
}
void unire (int a, int b){
int x = rege(a);
int y = rege(b);
if (x == y){
return;
}
if(numbersOfNodesInGraff[x] < numbersOfNodesInGraff[y]){
numbersOfNodesInGraff[y] += numbersOfNodesInGraff[x];
radacina[x] = y;
}
else {
numbersOfNodesInGraff[x] +=numbersOfNodesInGraff[y];
radacina[y] = x;
}
}
int main() {
ifstream f("apm.in");
ofstream g("apm.out");
int n, m;
f >> n >> m;
initializare(n);
for (int i = 1; i <= m; i++){
int x , y, cost;
f >> x >> y >> cost;
muchiiSortate.push_back({{x,y}, cost});
}
sort(muchiiSortate.begin(), muchiiSortate.end(), []( auto &primul, auto& doiul){
return primul.second < doiul.second;
});
int nr = 0, sum = 0;
for (int i = 0; i < m; i++){
int x = muchiiSortate[i].first.first;
int y = muchiiSortate[i].first.second;
int stanga = rege(x);
int dreapta = rege(y);
if (stanga != dreapta){
nr ++;
perechileDinGraff.push_back({x, y});
sum += muchiiSortate[i].second;
unire(stanga, dreapta);
}
}
g << sum << '\n';
g << nr << '\n';
for (auto x : perechileDinGraff)
g << x.first << " " << x.second << '\n';
return 0;
}