Pagini recente » Clasamentul arhivei de probleme | Cod sursa (job #2739182) | Statistici Mihailescu Malina Maria (malinutza_sweet) | Borderou de evaluare (job #2247199) | Cod sursa (job #2805716)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int N, M;
int findDis(int elem, vector<pair<int, int>> &multimi)
{
int radacina = elem;
while(multimi[radacina].first != radacina) {
radacina= multimi[radacina].first;
}
while(multimi[elem].first != radacina) {
int auxiliar = multimi[elem].first;
multimi[elem].first = radacina;
elem = auxiliar;
}
return radacina;
}
void unionDis(const int x, const int y, vector<pair<int, int>> &multimi)
{
int radX = findDis(x, multimi), radY = findDis(y, multimi);
if(multimi[radX].second > multimi[radY].second) {
multimi[radX].second = multimi[radX].second + multimi[radY].second;
multimi[radY].first = radX;
multimi[radY].second = multimi[radX].second;
}
else{
multimi[radY].second = multimi[radY].second + multimi[radX].second;
multimi[radX].first = radY;
multimi[radX].second = multimi[radY].second;
}
}
void Kruskal(vector<pair<int, pair<int, int>>> muchii)
{
vector<pair<int, int>> multimi(N + 1, {0, 0});
vector<int> rez(1, -1);
int costTotal = 0;
for(int i = 1; i <= N; ++i) {
multimi[i] = {i, 1};
}
sort(muchii.begin(), muchii.end());
for(int i = 1; i <= M; ++i) {
if( findDis(muchii[i].second.first, multimi) != findDis(muchii[i].second.second, multimi) ){
costTotal = costTotal + muchii[i].first;
rez.push_back(i);
}
if(rez.size() >= N) break;
}
fout << costTotal << "\n";
for(int i = 1; i < rez.size(); ++i) {
int j = rez[i];
fout << muchii[j].second.first << " " << muchii[j].second.second << "\n";
}
}
int main()
{
fin >> N >> M;
vector<pair<int, pair<int, int>>> muchii(M+1);
for(int i = 1; i <= M; ++i) {
int x, y, c;
fin >> x >> y >> c;
muchii[i] = {c, {x, y}};
}
Kruskal(muchii);
return 0;
}