Cod sursa(job #1979726)

Utilizator robert.stefanRobert Stefan robert.stefan Data 11 mai 2017 10:56:46
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
/* 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", cost, n - 1);
	for (i = 0; i < lenSol; ++i)
		fprintf(out, "%d %d\n", solA[i], solB[i]);

	fclose(in);
	fclose(out);
	return 0;
}