Pagini recente » Cod sursa (job #1220941) | Cod sursa (job #1321627) | Cod sursa (job #3221933) | Cod sursa (job #3170642) | Cod sursa (job #1770715)
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define MAX 400005
using namespace std;
int n, m, t[MAX], suma, in[MAX];
vector <pair<int,pair<int, int> > > g;
vector <pair<int, int> >rasp;
vector <pair<int,pair<int, int> > >::iterator it;
vector <pair<int, int> >::iterator it1;
void citire()
{
scanf("%d %d", &n, &m);
int x, y, c;
for(int i=1; i<=m; ++i)
{
scanf("%d %d %d", &x, &y, &c);
g.push_back(make_pair(c, make_pair(x, y)));
}
sort(g.begin(), g.end());
for(int i=1; i<=n; ++i)
{
t[i]=i;
in[i]=1;
}
}
int radacina(int x)
{
while(x!=t[x])
{
x=t[x];
}
return x;
}
int verificareMultime(int x, int y)
{
if(radacina(x)==radacina(y))
return 0;
return 1;
}
void inserare(int x, int y)
{
int radx=radacina(x);
int rady=radacina(y);
if(in[radx]>=in[rady])
{
t[radx]=rady;
in[radx]=max(in[radx], in[rady]+1);
in[rady]=in[radx];
}
else
{
t[rady]=radx;
in[rady]=max(in[rady], in[radx]+1);
in[radx]=in[rady];
}
rasp.push_back(make_pair(x, y));
}
void rezolvare()
{
int nr=1;
for(it=g.begin(); it!=g.end() && nr<=n-1; ++it)
{
if(verificareMultime(it->second.first, it->second.second))
{
inserare(it->second.first, it->second.second);
suma+=it->first;
nr++;
}
}
}
void afisare()
{
printf("%d\n%d\n", suma, n-1);
for(it1=rasp.begin(); it1!=rasp.end(); ++it1)
printf("%d %d\n", it1->first, it1->second);
}
int main()
{
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
citire();
rezolvare();
afisare();
return 0;
}