Cod sursa(job #2487752)

Utilizator Alex_AmarandeiAmarandei Matei Alexandru Alex_Amarandei Data 5 noiembrie 2019 18:25:32
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream> 
#include <algorithm>
#define NMAX 105
#define MMAX 5005
using namespace std;
ifstream fin("kruskal.in");
ofstream fout("kruskal.out");

struct muchie
{
	int x, y, c;
} a[MMAX];

int n, m, c[NMAX];
int t[NMAX];

void read();
void kruskal();
void write();

bool comp(muchie a, muchie b)
{
	return a.c < b.c;
}

// algoritmul Kruskal se bazeaza pe metoda Greedy si are o complexitate de n^2 + m^2

int main()
{
	read();
	sort(a + 1, a + 1 + m, comp);
	kruskal();
	write();

	return 0;
}

void read()
{
	int i;
	fin >> n >> m;
	for (i = 1; i <= m; i++)
		fin >> a[i].x >> a[i].y >> a[i].c;
	for (i = 1; i <= n; i++)
		c[i] = i;
}

void kruskal()
{
	int nr, small, big, i, j;

	for (i = 1, nr = 1; nr <= n - 1; i++)
		if (c[a[i].x] != c[a[i].y])
		{
			t[nr++] = i; //selectez muchia i
			// unific componentele conexe
			small = c[a[i].x]; big = c[a[i].y];
			if (small > big)
				swap(small, big);
			for (j = 1; j <= n; j++)
				if (c[j] == big)
					c[j] = small;
		}
}

void write()
{
	int i, cost;

	for (i = 1, cost = 0; i <= n - 1; i++)
		cost += a[t[i]].c;
	fout << cost << '\n';

	for (i = 1; i <= n - 1; i++)
		fout << a[t[i]].x << ' ' << a[t[i]].y << '\n';
}