Cod sursa(job #2231647)

Utilizator Silviu.Stancioiu@gmail.comSilviu Stancioiu [email protected] Data 15 august 2018 14:11:44
Problema Arbore partial de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>
#include <algorithm>

#define MAX_N 200005

using namespace std;

struct Muchie
{
	int nod1;
	int nod2;
	int cost;
	bool d;
};

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

int n, m;
vector<Muchie> muchii;
int parents[MAX_N] = { 0 };

int costFinal = 0;
int muchiiFinal = 0;

int GetComponent(int node)
{
	if (parents[node] == node)
	{
		return node;
	}

	return parents[node] = GetComponent(parents[node]);
}

void Kruskal()
{
	int muchie = 0;
	int index = 0;
	int cost = 0;

	for (int i = 1; i <= n; i++)
	{
		parents[i] = i;
	}

	while (muchie < n - 1)
	{
		Muchie& muc = muchii[index];

		int parent1 = GetComponent(muc.nod1);
		int parent2 = GetComponent(muc.nod2);
	
		if (parent1 != parent2)
		{
			muc.d = true;
			parents[parent2] = parent1;

			cost += muc.cost;

			muchie++;
		}

		index++;
	}

	costFinal = cost;
	muchiiFinal = muchie;
}

int main(void)
{
	fin >> n >> m;

	for (int i = 0; i < m; i++)
	{
		Muchie muc = Muchie();
		
		fin >> muc.nod1 >> muc.nod2 >> muc.cost;
		muc.d = false;

		muchii.push_back(muc);
	}

	sort(muchii.begin(), muchii.end(), [](const Muchie& m1, const Muchie& m2)
	{
		return m1.cost < m2.cost;
	});

	Kruskal();

	fout << costFinal << endl << muchiiFinal << endl;

	for (int i = 0; i < muchii.size(); i++)
	{
		if (muchii[i].d)
		{
			fout << muchii[i].nod1 << " " << muchii[i].nod2 << endl;
		}
	}

	fin.close();
	fout.close();

	return 0;
}