Pagini recente » Cod sursa (job #218966) | Cod sursa (job #1547540) | Cod sursa (job #1394531) | Cod sursa (job #2393054) | Cod sursa (job #1608079)
#include <cstdio>
#include <algorithm>
using namespace std;
struct edg
{
int u,v,val;
}a[400002];
int n,m, t[200002],h[200002],cnt;
bool viz2[400002];
bool cmp(edg c, edg b)
{
return c.val < b.val;
}
inline int FindSet (int x)
{
while (x!=t[x])
x=t[x];
return x;
}
inline void UnionSet (int x, int y)
{
int a=FindSet(x),b=FindSet(y);
if (h[a]<h[b]) t[a]=b;
else
{
t[b]=a;
if (h[a]==h[b]) h[a]++;
}
}
int main()
{
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
int sum=0;
scanf("%d%d", &n, &m);
for(int i=1; i<=m; i++)
scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].val);
for(int i=1; i<=n; i++)
t[i]=i;
sort(a+1, a+m+1, cmp);
for(int i=1; i<=m && cnt< n-1; i++)
if(FindSet(a[i].u)!=FindSet(a[i].v))
{
viz2[i]=1;
UnionSet(a[i].u,a[i].v);
sum+=a[i].val;
cnt++;
}
printf("%d\n%d\n", sum,cnt);
for(int i=1; i<=m; i++)
if(viz2[i])
printf("%d %d\n", a[i].u, a[i].v);
return 0;
}