Pagini recente » Borderou de evaluare (job #2252119) | Cod sursa (job #1028615) | Cod sursa (job #2240777) | Cod sursa (job #2116828) | Cod sursa (job #1979724)
/* Kruskal */
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAXN 200005
#define MAXM 400005
#define IN "apm.in"
#define OUT "apm.out"
FILE *in = fopen(IN, "r");
FILE *out = fopen(OUT, "w");
int n, m;
int a[MAXM], b[MAXM], c[MAXM];
int index[MAXM], g[MAXN];
int cost, lenSol, solA[MAXN], solB[MAXN];
int cmp(const void * x, const void * y){
int x1 = *(int*) x;
int y1 = *(int*) y;
return (c[x1] < c[y1]);
}
int grupa(int x){
if(g[x] == x)
return g[x];
return grupa(g[x]);
}
void reuniune(int x, int y){
// grupa(x) imi da, de fapt, nodul care da numarul grupei
g[grupa(x)] = grupa(y);
}
int main(void){
int i;
fscanf(in, "%d%d", &n, &m);
for (i = 1; i <= m; ++i){
fscanf(in, "%d%d%d", &a[i], &b[i], &c[i]);
index[i] = i;
}
// sortez tabloul de index in functie de costul fiecarui arc (de la cel mai ieftin arc la cel mai scump)
// index[i] - indexul din tabloul a/b/c la care gasesc arcul i
qsort(index, m, sizeof(int), cmp);
// pun fiecare nod intr-o grupa
for (i = 1; i <= n; ++i)
g[i] = i;
i = 1;
while (i <= m && lenSol < n){
if (grupa(a[index[i]]) != grupa(b[index[i]])){
reuniune(a[index[i]], b[index[i]]);
cost += c[index[i]];
solA[lenSol] = a[index[i]];
solB[lenSol] = b[index[i]];
++lenSol;
}
++i;
}
fprintf(out, "%d %d\n", n - 1, cost);
for (i = 0; i < lenSol; ++i)
fprintf(out, "%d %d\n", solA[i], solB[i]);
fclose(in);
fclose(out);
return 0;
}