Cod sursa(job #2231650)

Utilizator Silviu.Stancioiu@gmail.comSilviu Stancioiu [email protected] Data 15 august 2018 14:24:32
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>

#include <vector>
#include <algorithm>

#define MAX_N 200005

using namespace std;

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

FILE* fin;
FILE* fout;

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 = fopen("apm.in", "r");
	fout = fopen("apm.out", "w");

	fscanf(fin, "%d %d", &n, &m);
	
	for (int i = 0; i < m; i++)
	{
		Muchie muc = Muchie();
		
		fscanf(fin, "%d %d %d", &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();
	
	fprintf(fout, "%d\n%d\n", costFinal, muchiiFinal);
	
	for (int i = 0; i < m; i++)
	{
		if (muchii[i].d)
		{
			fprintf(fout, "%d %d\n", muchii[i].nod1, muchii[i].nod2);
		}
	}

	fclose(fin);
	fclose(fout);

	return 0;
}