Pagini recente » Cod sursa (job #2572875) | Cod sursa (job #2403714) | Cod sursa (job #2337694) | Cod sursa (job #1364499) | Cod sursa (job #2859802)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("apm.in");
ofstream fout("apm.out");
const int dim = 400005;
struct Muchie {
int x, y, z;
}v[dim];
int n, m, cost, cnt;
int x, y, z;
int t[200005];
int rang[200005];
pair<int, int> sol[200005];
bool cmp(Muchie a, Muchie b) {
return a.z < b.z;
}
int radacina(int nod) {
while (t[nod] != -1)
nod = t[nod];
return nod;
}
void unire(int radx, int rady) {
if (rang[radx] < rang[rady])
t[radx] = rady;
else
t[rady] = radx;
if (rang[radx] == rang[rady])
rang[rady]++;
}
inline void apm() {
for (int i = 1; i <= n; i++) {
t[i] = -1;
rang[i] = 1;
}
for (int i = 1; i <= m; i++) {
int radx = radacina(v[i].x);
int rady = radacina(v[i].y);
if (radx != rady) {
sol[++cnt] = {v[i].x, v[i].y};
cost += v[i].z;
unire(radx, rady);
}
}
}
int main(){
fin >> n >> m;
for (int i = 1; i <= m; i++) {
fin >> v[i].x >> v[i].y >> v[i].z;
}
sort(v + 1, v + m + 1, cmp);
apm();
fout << cost << '\n';
fout << cnt << '\n';
for (int i = 1; i <= cnt; i++) {
fout << sol[i].first << ' ' << sol[i].second << '\n';
}
return 0;
}