Pagini recente » Cod sursa (job #653171) | poli_iasi | Cod sursa (job #1798463) | Cod sursa (job #2896266) | Cod sursa (job #2430785)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int dad[400001];
int boss(int slave)
{
if( dad[slave] != slave )
dad[slave] = boss(dad[slave]);
return dad[slave];
}
int unify(int a, int b)
{
dad[ boss(a) ] = boss(b);
}
int main()
{
FILE *fin;
FILE *fout;
fin = fopen("apm.in", "r");
fout = fopen("apm.out", "w");
int V, E;
fscanf(fin, "%d%d", &V, &E);
for(int i=1; i<=V; i++)
dad[i] = i;
vector < pair < int, pair < int, int> > > edges;
vector < pair < int, int> > results;
int a, b, w;
for(int i=0; i<E; i++)
{
fscanf(fin, "%d%d%d", &a, &b, &w);
edges.push_back(make_pair(w, make_pair(a, b) ) );
}
sort(edges.begin(), edges.end());
int Weight = 0, Edges = 0, i = 0;
while( Edges < V-1 && i<E )
{
a = edges[i].second.first;
b = edges[i].second.second;
w = edges[i].first;
if(boss(a)!=boss(b))
{
unify(a, b);
Weight += w;
Edges++;
results.push_back( make_pair(a, b) );
}
i++;
}
fprintf(fout, "%d\n%d\n", Weight, Edges);
for(i=0; i<Edges; i++)
fprintf(fout, "%d %d\n", results[i].first, results[i].second);
}