Cod sursa(job #1436064)

Utilizator vlad.olaruOlaru Andrei Vlad vlad.olaru Data 14 mai 2015 23:05:10
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<fstream>
#include<algorithm>
#include<vector>

using namespace std;
#define NEGINF -32000

ifstream fin("kruskal.in");
ofstream fout("kruskal.out");

struct sEdges{ int x, y, c; };
int n, m;
vector<sEdges> costs;

class CompareEdges
{
public:
	bool operator()(const sEdges& x, const sEdges& y) const
	{
		return x.c < y.c;
	}
};

void citire()
{
	fin >> n >> m;
	int x, y, c;
	for (int i = 1; i <= m; i++)
	{
		fin >> x >> y >> c;
		sEdges k;
		k.x = x;
		k.y = y;
		k.c = c;
		costs.push_back(k);
	}
	fin.close();
}

void rezolva()
{
	int *vertex;
	vertex = new int[n + 1];
	for (int i = 1; i <= n; i++) vertex[i] = i;
	make_heap(costs.begin(), costs.end(), CompareEdges());
	sort_heap(costs.begin(), costs.end(), CompareEdges());
	for (int i = 0; i<m; i++)
	{
		sEdges k = costs[i];
		if (vertex[k.x] != vertex[k.y]) {
			int vX = vertex[k.x];
			int vY = vertex[k.y];
			for (int j = 1; j <= n; j++)
			if (vertex[j] == vX || vertex[j] == vY)
				vertex[j] = vY;
		}
		else
			costs[i].c = NEGINF;
	}
}

void afiseaza()
{
	for (int i = 0; i<m; i++)
	if (costs[i].c != NEGINF)
		fout << costs[i].x << " " << costs[i].y << "\n";
	fout.close();
}

int main()
{
	citire();
	rezolva();
	afiseaza();
	return 0;
}