Pagini recente » Cod sursa (job #2897471) | Cod sursa (job #1892701) | Cod sursa (job #2616710) | Cod sursa (job #1842580) | Cod sursa (job #1438000)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int MAX = 400003;
struct truple
{
int a, b, w;
};
truple v[MAX];
int vtata[MAX];
vector<pair<int, int> >vsol;
bool comp(truple a, truple b)
{
return a.w < b.w;
}
int ftata(int nod);
void uneste(int a, int b);
int n, m;
int main()
{
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
int solW = 0, tata1, tata2, solM=0;
scanf("%d%d", &n, &m);
for(int i=1; i<=m; i++)
scanf("%d%d%d", &v[i].a, &v[i].b, &v[i].w);
sort(v+1, v+m+1, comp);
for(int i=1; i<=n; i++) vtata[i] = i;
for(int i=1; i<=m; i++)
{
tata1 = ftata(v[i].a);
tata2 = ftata(v[i].b);
if(tata1 != tata2)
{
solM++;
solW += v[i].w;
uneste(v[i].a, v[i].b);
vsol.push_back(make_pair(v[i].a, v[i].b));
}
}
printf("%d\n%d\n", solW, solM);
vector<pair<int, int> >::iterator it;
for(it=vsol.begin(); it!=vsol.end(); ++it)
printf("%d %d\n", it -> first, it -> second);
return 0;
}
void uneste(int a, int b)
{
vtata[ftata(b)] = ftata(a);
}
int ftata(int nod)
{
if(vtata[nod] == nod)
return nod;
vtata[nod] = ftata(vtata[nod]);
return vtata[nod];
}