Pagini recente » Cod sursa (job #1075654) | Cod sursa (job #3302698) | Cod sursa (job #1768958) | Cod sursa (job #2772386) | Cod sursa (job #1979738)
/* 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, sol[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, g1, g2;
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 + 1, 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 - 1){
g1 = grupa(a[index[i]]);
g2 = grupa(b[index[i]]);
if (g1 != g2){
g[g1] = g2;
//reuniune(a[index[i]], b[index[i]]);
cost += c[index[i]];
sol[lenSol++] = index[i];
}
++i;
}
fprintf(out, "%d %d\n", cost, n - 1);
for (i = 0; i < lenSol; ++i)
fprintf(out, "%d %d\n", a[sol[i]], b[sol[i]]);
fclose(in);
fclose(out);
return 0;
}