Pagini recente » Cod sursa (job #1518679) | Istoria paginii runda/concurs_nou-andrei | Cod sursa (job #952097) | Cod sursa (job #854651) | Cod sursa (job #2175674)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
struct nod{
int x,y,cost;}v[200001];
bool cmp(nod a,nod b){
return a.cost<b.cost;}
bool root(int, int);
int radacina(int );
void uniune(int,int);
int n,ind,t[200001],h[200001];
int main()
{
int m,i,ind=0;
long long suma=0;
in >> n >> m;
for(i=1;i<=m;++i)
in >> v[i].x >> v[i].y >> v[i].cost;
sort (v+1,v+m+1,cmp);
for (i=1;i<=m;++i)
{
if (!root(v[i].x,v[i].y))
{suma+=v[i].cost;
uniune(v[i].x,v[i].y);
v[++ind].x=v[i].x;
v[ind].y=v[i].y;
}
}
out << suma << '\n' << ind << '\n';
for (i=1;i<=ind;++i)
out << v[i].x << ' ' << v[i].y << '\n';
return 0;
}
int radacina(int x)
{
if (t[x]==0 || t[x]==x)
return x;
t[x]=radacina(t[x]);
return t[x];
}
void uniune(int x,int y)
{
int rx=radacina(x),ry=radacina(y);
if (h[rx]>h[ry])
{
t[ry]=rx;
}
else
{
t[rx]=ry;
if (h[rx]==h[ry])
h[ry]++;
}
}
bool root(int x, int y)
{
return radacina(x)==radacina(y);
}