Pagini recente » Cod sursa (job #1999771) | Cod sursa (job #1711607) | Cod sursa (job #1736230) | Cod sursa (job #2030543) | Cod sursa (job #1958948)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
/** KRUSKAL **/
FILE *fin = fopen("apm.in", "r"), *fout = fopen("apm.out", "w");
#define MAX_M 400000
int tata[MAX_M + 1];
inline int find1(int nr) {
int nr1 = nr;
while(nr1 != tata[nr1])
nr1 = tata[nr1];
while(nr != tata[nr]) {
tata[nr] = nr1, nr = tata[nr];
}
return nr;
}
inline int union1(int i, int j) {
int i1 = find1(i), j1 = find1(j);
tata[i1] = j1;
}
struct elem {
int x, y, c;
};
elem v[MAX_M + 1];
vector <int> vans;
int costarb;
bool cmp(elem i, elem j) {
return i.c < j.c;
}
int main() {
int n, m;
fscanf(fin, "%d%d", &n, &m);
for(int i = 1;i <= m;i++) {
int X, Y, C;
fscanf(fin, "%d%d%d", &X, &Y, &C);
v[i].x = X;
v[i].y = Y;
v[i].c = C;
}
for(int i = 1;i <= m;i++)
tata[i] = i;
sort(v + 1, v + m + 1, cmp);
for(int i = 1;i <= m;i++) {
int x1 = find1(v[i].x), y1 = find1(v[i].y);
if(x1 != y1) {
costarb += v[i].c, union1(v[i].x, v[i].y);
vans.push_back(i);
}
}
fprintf(fout, "%d %d\n", costarb, n - 1);
for(unsigned int i = 0;i < vans.size();i++)
fprintf(fout, "%d %d\n",v[vans[i]].x, v[vans[i]].y);
fclose(fin), fclose(fout);
return 0;
}