Pagini recente » Cod sursa (job #739566) | Cod sursa (job #2263241) | Cod sursa (job #1239261) | Cod sursa (job #2498531) | Cod sursa (job #1777467)
#include <iostream>
#include <cstdio>
#include <algorithm>
#define Nmax 200050
#define Mmax 400050
using namespace std;
int n,m,a,b,cost,costm = 0,j;
int tatal[Nmax],adancime[Nmax];
pair<int,int> solutie[Nmax];
struct vector2
{
int varf1,varf2,cost;
}vec[Mmax];
int radacina(int x)
{
int aux = x,aux2 = x;
while(tatal[aux] != aux)
aux = tatal[aux];
while(tatal[aux2] != aux2)
{
x = tatal[aux2];
tatal[aux2] = aux;
aux2 = x;
}
return aux;
}
void unite(int x, int y)
{
if(adancime[x] > adancime [y])
tatal[y] = tatal[x];
else
tatal[x] = tatal[y];
if(adancime[x] == adancime [y])
{
adancime[y]++;
tatal[x] = y;
}
}
bool compare( vector2 a, vector2 b)
{
if(a.cost < b.cost)
return 1;
else
return 0;
}
void solve()
{
for(int i = 1 ; i <= m ; i++)
{
if(radacina(vec[i].varf1) != radacina(vec[i].varf2))
{
costm += vec[i].cost;
unite(radacina(vec[i].varf1), radacina(vec[i].varf2));
solutie[j++] = make_pair(vec[i].varf1,vec[i].varf2);
}
}
}
void read()
{
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i = 1 ; i <= n ; i++)
{
tatal[i] = i;
adancime[i] = 1;
}
for(int i = 1 ; i <= m ; i++)
{
scanf("%d %d %d",&a,&b,&cost);
vec[i].cost=cost;
vec[i].varf1 = a;
vec[i].varf2 = b;
}
sort(vec + 1, vec + m , compare);
}
int main()
{
read();
solve();
printf("%d\n",costm);
for(int i = 0 ; i < j ; i++)
printf("%d %d\n",solutie[i].first,solutie[i].second);
return 0;
}