Pagini recente » Cod sursa (job #340017) | Cod sursa (job #1076596) | Cod sursa (job #2507576)
#include<fstream>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
struct muchie
{
int sursa;
int dest;
int cost;
};
muchie *graf[400001];
int *parinte[200001];
muchie* sol[200000];
inline bool SortByCost(muchie* a, muchie* b) { return a->cost < b->cost; }
int cauta_radacina(int x)
{
if (x == *parinte[x])
return x;
else
return *parinte[x] = cauta_radacina(*parinte[x]);
}
void uniune(int x, int y)
{
int frunza, radacina;
frunza = cauta_radacina(x);
radacina = cauta_radacina(y);
*parinte[frunza] = radacina;
}
void kruskal(int n, int m)
{
int i, k, x, y, total_cost;
total_cost = i = k = 0;
while (k < n - 1)
{
if (cauta_radacina(graf[i]->sursa) != cauta_radacina(graf[i]->dest))
{
total_cost = total_cost + graf[i]->cost;
sol[k++]=graf[i];
uniune(*parinte[graf[i]->dest], *parinte[graf[i]->sursa]);
}
i++;
}
fout << total_cost << "\n";
}
int main()
{
int noduri, muchii, x, y, c;
fin >> noduri >> muchii;
for (int i = 0; i <= noduri; i++)
parinte[i] = new int(i);
parinte[noduri + 1] = nullptr;
for (int i = 0; i < muchii; i++)
{
fin >> x >> y >> c;
graf[i] = new muchie{ x,y,c };
}
graf[muchii] = nullptr;
sort(graf, graf + muchii, SortByCost);
kruskal(noduri, muchii);
fout << noduri - 1 << "\n";
for (int i = 0; i< noduri - 1; i++)
fout << sol[i]->sursa << " " << sol[i]->dest << "\n";
return 0;
}