Pagini recente » Cod sursa (job #2439037) | Cod sursa (job #3002625) | Cod sursa (job #2226339) | Cod sursa (job #1689489) | Cod sursa (job #1232312)
# include <cstdio>
# include <fstream>
# include <iostream>
# include <vector>
# include <cstring>
# include <cctype>
# include <algorithm>
# include <cmath>
# include <set>
# define sz size()
# define bg begin()
# define ed end()
# define pb push_back
# define in insert
# define mp make_pair
# define F first
# define S second
# define N 200010
# define M 400010
using namespace std;
int T[N],R[N];
int i,n,m,x,y,C=0;
multiset < pair< int, pair<int, int > > > h;
multiset < pair< int, pair<int, int > > > :: iterator it;
vector < pair< int, int> > Sol;
int find(int x)
{
if(T[x]!=x) T[x]=find(T[x]);
return T[x];
}
void reuneste(int x, int y)
{
if(R[x]>R[y]) T[y]=x;
else T[x]=y;
if(R[x]==R[y]) R[x]++;
}
void load()
{
int x,y,c;
scanf("%d %d\n", &n, &m);
for(; m; m--)
{
scanf("%d %d %d", &x, &y, &c);
h.in(mp(c,mp(x,y)));
}
}
int main()
{
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
load();
for(i=1; i<=n; ++i)
{
T[i]=i;
R[i]=1;
}
for(it=h.bg; it!=h.ed && Sol.sz<n; ++it)
{
x=find((*it).S.F);
y=find((*it).S.S);
if(x!=y)
{
C+=(*it).F;
Sol.pb(mp(((*it).S.F),(*it).S.S));
reuneste(x,y);
}
}
printf("%d\n%d\n", C, n-1);
for(i=0; i<n-1; ++i)
printf("%d %d\n", Sol[i].S, Sol[i].F);
fclose(stdin);
fclose(stdout);
return 0;
}