Pagini recente » Cod sursa (job #2479624) | Cod sursa (job #808355) | Cod sursa (job #3138781) | Cod sursa (job #960810) | Cod sursa (job #2566373)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int MaxN = 100001;
const int MaxM = 400004;
struct Muchie{
int x;
int y;
int cost;
}mu[MaxM], Rez[MaxM];
int n, m;
int Tata[MaxN], Rang[MaxM];
void Citire();
bool Compara(const Muchie &a, const Muchie &b);
int Radacina(int nod);
bool Unire(int x, int y);
int main()
{
Citire();
int cost_Total = 0, indice = 0;
for (int i = 1; i <= m; ++i)
{
if (Unire(mu[i].x, mu[i].y))
{
Rez[++indice].x = mu[i].x;
Rez[indice].y = mu[i].y;
cost_Total += mu[i].cost;
}
}
fout << cost_Total << '\n';
fout << indice << '\n';
for (int i = 1; i <= indice; ++i)
fout << Rez[i].x << ' ' << Rez[i].y << '\n';
}
bool Unire(int x, int y)
{
int rx = Radacina(x), ry = Radacina(y);
if (rx != ry)
{
if (Rang[ry] > Rang[rx])
{
Tata[rx] = ry;
}
else
{
Tata[ry] = rx;
if (Rang[rx] == Rang[ry])
Rang[rx]++;
}
return true;
}
return false;
}
int Radacina(int nod)
{
if (Tata[nod] == 0)
return nod;
else
{
int r = Radacina(Tata[nod]);
Tata[nod] = r;
return r;
}
}
void Citire()
{
fin >> n >> m;
for (int i = 1; i <= m; ++i)
fin >> mu[i].x >> mu[i].y >> mu[i].cost;
sort(mu + 1, mu + m + 1, Compara);
}
bool Compara(const Muchie &a, const Muchie &b)
{
return (a.cost < b.cost);
}