Pagini recente » Cod sursa (job #1679089) | Cod sursa (job #1550460) | Cod sursa (job #1951518) | Cod sursa (job #3241090) | Cod sursa (job #3000810)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
struct inf{
int x, y, c;
};
int n, m;
int t[200005], rang[200005];
long long sum;
vector <inf> v;
vector <pair <int, int> > z;
bool cmp(inf a, inf b)
{
return a.c <= b.c;
}
int rad(int nod)
{
if(t[nod]==0)
return nod;
else
{
int aux=rad(t[nod]);
t[nod]=aux;
return aux;
}
}
void unire(int a, int b)
{
int ra=rad(a), rb=rad(b);
if(ra!=rb)
{
if(rang[ra] > rang[rb])
t[rb]=ra;
else{
t[ra]=rb;
if(rang[ra]==rang[rb])
rang[rb]++;
}
}
}
int main()
{
f>>n>>m;
for(int i=1; i<=m; i++)
{
int a, b, cost;
inf aux;
f>>a>>b>>cost;
aux.x=a;
aux.y=b;
aux.c=cost;
v.push_back(aux);
}
sort(v.begin(), v.end(), cmp);
int i=0;
while(n>1)
{
int a=v[i].x;
int b=v[i].y;
int cost=v[i].c;
int ra=rad(a);
int rb=rad(b);
if(ra!=rb)
{
unire(ra, rb);
z.push_back(make_pair(a, b));
n--;
sum+=cost;
}
i++;
}
g<<sum<<'\n';
for(auto elem:z)
g<<elem.first<<" "<<elem.second<<'\n';
return 0;
}