Pagini recente » Cod sursa (job #1665621) | Cod sursa (job #2184743) | Istoria paginii runda/vot | Cod sursa (job #2474824) | Cod sursa (job #2176968)
#include <bits/stdc++.h>
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
struct rec
{
int x,y,c;
}a[400005];
int n,m;
int parent[200005],sz[200005];
pair < int, int > sol[200005];
int Find( int x )
{
if( parent[x] == x ) return x;
return Find(parent[x]);
}
void Union( int x, int y )
{
x = Find(x);
y = Find(y);
if( sz[x] > sz[y] )
{
parent[y] = x;
sz[x]+=sz[y];
}
else
{
parent[x] = y;
sz[y] += sz[x];
}
}
bool cmp( const rec &l, const rec &r)
{
return l.c < r.c;
}
int main()
{
ios::sync_with_stdio(0);
in >> n >> m;
for(int i=1; i<=n; i++) parent[i] = i, sz[i] = 1;
for(int i=1; i<=m; i++)
in >> a[i].x >> a[i].y >> a[i].c;
sort(a+1,a+m+1,cmp);
int k=1, sum=0, i=0;
while( k<=m && i < n )
{
if( Find(a[k].x) != Find(a[k].y) )
{
sum += a[k].c;
sol[++i].first = a[k].x;
sol[i].second = a[k].y;
Union(a[k].x, a[k].y);
k++;
}
else k++;
}
out << sum << '\n' << n-1 << '\n'
;
for(int i=1; i<n; i++)
{
out << sol[i].second << ' ' << sol[i].first << '\n';
}
return 0;
}