Cod sursa(job #1423173)

Utilizator horatiu13Horatiu horatiu13 Data 21 aprilie 2015 15:43:17
Problema Arbore partial de cost minim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#define NMAX 4000

using namespace std;

vector<int> c;

void citire(int &n, int &m, vector<int>& x, vector<int>& y, vector<int>& indici)
{
	ifstream fin("apm.in");
	fin >> n >> m;
	int aux;
	for (int i = 0; i < m; ++i)
	{
		fin >> aux;
		x.push_back(aux);
		fin >> aux;
		y.push_back(aux);
		fin >> aux;
		c.push_back(aux);
		indici.push_back(i);
	}
	
	fin.close();
}

const bool cmp(const int &i, const int &j)
{
	return (c[i] < c[j]);
}

int grupa(const int& i, vector<int>& grup)
{
	if (grup[i] == i) 
		return i;
	grup[i] = grupa(grup[i], grup);
	return grup[i];
}

void reuniune(const int& i, const int& j, vector<int>& grup)
{
	grup[grupa(i, grup)] = grupa(j, grup);
}

void kruskal(vector<int>& grup, const vector<int>& indici, const vector<int>& x, const vector<int>& y, vector<int>& vans, const int& n, const int &m, int& ans)
{
	for (int i = 0; i < n; i++)
		grup.push_back(i);
	for (int i = 0; i < m; ++i)
	{
		if (grupa(x[indici[i]], grup) != grupa(y[indici[i]], grup))
		{
			ans += c[indici[i]];
			reuniune(x[indici[i]], y[indici[i]], grup);
			vans.push_back(indici[i]);
		}
	}
}

void afisare(const int& ans, const int& n, vector<int>& vans, const vector<int>& x, const vector<int>& y)
{
	ofstream fout("apm.out");
	fout << ans << "\n";
	fout << n-1 << "\n";
	for (int i = 0; i < n-1; ++i)
		fout << x[vans[i]] << " " << y[vans[i]] << "\n";
}

int main()
{
	int m;
	int n;
	int ans = 0;
	vector<int> grup;
	vector<int> indici;
	vector<int> x;
	vector<int> y;
	
	vector<int> vans;
	
	citire(n, m, x, y, indici);
	sort(indici.begin(), indici.end(), cmp);
	kruskal(grup, indici, x, y, vans, n, m, ans);
	afisare(ans, n, vans, x, y);
	return 0;
}