Pagini recente » Cod sursa (job #2374948) | Cod sursa (job #1808644) | Cod sursa (job #3150816) | Cod sursa (job #2801630) | Cod sursa (job #3269843)
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
struct muchie {
int inc;
int sf;
int cost;
};
const int LIM_M = 400001;
const int LIM_N = 200001;
muchie sm[LIM_M], arbore[LIM_N]; // sirul muchiilor
int n, m, comp[LIM_N], ca, nms, csfm, j;
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;
}
void sortm() {
int i;
bool AmSchimbat;
muchie aux;
do {
AmSchimbat = false;
for (i = 1; i <= m - 1; i++)
if (sm[i].cost > sm[i + 1].cost) { // Nu sunt in ordinea corecta
aux = sm[i];
sm[i] = sm[i + 1];
sm[i + 1] = aux;
AmSchimbat = true;
}
} while (AmSchimbat);
}
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();
// arata_comp();
sortm();
for (i = 1; nms <= n - 2; i++)
if (comp[sm[i].inc] != comp[sm[i].sf]) { // Extremitatile muchiei curente sunt in componente conexe diferite.
nms++;
arbore[nms] = sm[i];
ca += sm[i].cost;
csfm = comp[sm[i].sf]; // Retinem numarul de componenta al sfarsitului muchiei.
for (j = 1; j <= n; j++)
if (comp[j] == csfm) // Schimbam numarul de componenta?
comp[j] = comp[sm[i].inc];
}
rezultat();
}