Cod sursa(job #2423005)

Utilizator boguklMirzea Bogdan bogukl Data 20 mai 2019 16:33:48
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
std::ifstream fin("apm.in");
std::ofstream fout("apm.out");

struct Muchii
{
	int cost,a,b;
};


bool cmp(Muchii a,Muchii b)
{
	return a.cost<b.cost;
}

int gaseste_reprezentant(std::vector<int>&reprezentant,int nod)
{
	if(reprezentant[nod]==nod)
		return nod;

	reprezentant[nod]=gaseste_reprezentant(reprezentant,reprezentant[nod]);

	return reprezentant[nod];
}

std::vector<Muchii> kruskal(std::vector<Muchii>&muchii,int n,int m)
{


	std::vector<Muchii> arbore;

	sort(muchii.begin(), muchii.end(),cmp);
	std::vector<int> culoare(n+1);
	std::vector<int> reprezentant(n+1);


	int total=0;


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

	for (auto muchie:muchii)
	{
		int ra=gaseste_reprezentant(reprezentant,muchie.a);
		int rb=gaseste_reprezentant(reprezentant,muchie.b);
		if(culoare[ra]!=culoare[rb])
		{
			total+=muchie.cost;
			reprezentant[ra]=rb;
			arbore.push_back(muchie);
		}
	}
	fout<<total<<'\n';
	return arbore;
}





int main(int argc, char const *argv[])
{



	int n,m;
	fin>>n>>m;
	std::vector<Muchii> muchii;




	for (int i = 0; i < m; ++i)
	{
		Muchii muchie;
		fin>>muchie.a>>muchie.b>>muchie.cost;
		muchii.push_back(muchie);
	}

	

	std::vector<Muchii> arbore=kruskal(muchii,n,m);

	fout<<n-1<<'\n';
	
	for (auto muchie:arbore)
	{
	
		fout<<muchie.a<<' '<<muchie.b<<'\n';
	}
	

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

}