Cod sursa(job #1374352)

Utilizator MarronMarron Marron Data 5 martie 2015 08:25:29
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>


struct vec3 {
	int x, y, z;

	vec3(int _x, int _y, int _z) {
		x = _x;
		y = _y;
		z = _z;
	}

	bool operator<(vec3 v) {
		return this->z < v.z;
	}
};


const int MAXN = 200005;
const int MAXM = 400005;
std::ifstream f("apm.in");
std::ofstream g("apm.out");
std::vector<vec3> edge;
std::vector<int> G[MAXN];
std::bitset<MAXN> used;
int parent[MAXN];
int n, m;


int find(int x)
{
	int r = x;
	while (r != parent[r]) {
		r = parent[r];
	}

	while (x != r) {
		int aux = parent[x];
		parent[x] = r;
		x = aux;
	}

	return r;
}


void unite(int x, int y)
{
	x = find(x);
	y = find(y);
	parent[x] = y;
}


int main()
{
	f >> n >> m;
	for (int i = 0, x, y, z; i < m; i++) {
		f >> x >> y >> z;
		edge.push_back(vec3(x, y, z));

		G[x].push_back(y);
		G[y].push_back(x);
	}
	for (int i = 1; i <= n; i++) {
		parent[i] = i;
	}

	
	std::sort(edge.begin(), edge.end());


	int sol = 0, count = 0;
	for (int i = 0; i < m; i++) {
		if (find(edge[i].x) != find(edge[i].y)) {
			unite(edge[i].x, edge[i].y);
			used[i] = true;
			sol += edge[i].z;
			count++;
		}
	}

	g << sol << '\n' << count << '\n';
	for (int i = 0; i < m; i++) {
		if (used[i] == true) {
			g << edge[i].x << ' ' << edge[i].y << '\n';
		}
	}
	g.flush();
	


	//system("pause");
	f.close();
	g.close();
	return 0;
}