Pagini recente » Cod sursa (job #345860) | Cod sursa (job #3139553) | Cod sursa (job #2462399) | Cod sursa (job #3128926) | Cod sursa (job #1312901)
/*
http://www.infoarena.ro/problema/apm
Se determina un arbore partial minim.
50 p
*/
#include <fstream>
//#include <iostream>
#include <algorithm>
#define LIM_M 400001
#define LIM_N 200001
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
struct muchie {
int inc; int sf; int cost;
};
muchie sm[LIM_M], arbore[LIM_M];
int n, m, nms, csfm, comp[LIM_N], j, ca;
void citire () {
int i;
fin >> n >> m;
for (i = 1; i <= m; i++)
fin >> sm[i].inc >> sm[i].sf >> sm[i].cost;
}
void initcomp () {
int i;
for (i = 1; i <= n; i++)
comp[i] = i;
}
bool cmp (muchie a, muchie b) {
return a.cost < b.cost;
}
void rezultat () {
fout << ca << '\n' << n - 1 << '\n';
for (int i = 1; i <= nms; i++) // pentru toate muchiile selectate
fout << arbore[i].inc << ' ' << arbore[i].sf << '\n';
}
int main () {
int i;
citire();
initcomp();
sort(sm + 1, sm + m + 1, cmp);
for (i = 1; nms <= n-2; i++) { // Se vor selecta n-1 muchii.
if (comp[sm[i].inc] != comp[sm[i].sf]) { // Extremitatile muchiei curente sunt in componente conexe diferite.
nms++; // Selectam inca o muchie.
arbore[nms] = sm[i]; // Retinem muchia in arbore.
ca += arbore[nms].cost; // Actualizam costul arborelui.
csfm = comp[sm[i].sf]; // Retinem numarul de componenta al sfarsitului muchiei.
for (j = 1; j <= n; j++) // Actualizam numerele de componenta conexa.
if (comp[j] == csfm) // Nodurile sunt in aceeasi componenta cu cele pentru care se modifica numarul
comp[j] = comp[sm[i].inc]; // Modificam numarul de componenta conexa.
}
}
rezultat();
}
/* Fisierul de date corespunzator prezentarii Powerpoint:
8 13
1 2 2
1 3 9
1 4 3
1 7 6
2 5 4
3 5 5
3 6 3
4 7 2
4 8 1
5 6 7
6 7 8
6 8 4
7 8 2
*/