Cod sursa(job #2323115)

Utilizator Losnariu_Gabi_FMI_UVTLosnariu Gabriel Losnariu_Gabi_FMI_UVT Data 18 ianuarie 2019 20:45:11
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

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

#define NMax 200010
#define MMax 400010

struct latura{
	int x, y;
	int c;
	bool operator()(latura & ob1, latura & ob2){
		return ob1.c < ob2.c;
	}
};

int n, m,tata[NMax];
latura G[MMax];

vector<int> apm;
int cost;

int Find(int);
void Union(int, int);


void init();
void rezolvare();
void afisare();

int main(){
	init();
	rezolvare();
	afisare();
}

void init(){
	fin >> n >> m;
	for(int i = 0; i < m; i++)
		fin >> G[i].x >> G[i].y >> G[i].c;
	apm.reserve(m);
}

void rezolvare(){
	int i;
	sort(G, G + m, latura());
	for(i = 0; i < m; i++)
		if(Find(G[i].x) != Find(G[i].y)){
			Union(Find(G[i].x), Find(G[i].y));
			apm.push_back(i);
			cost += G[i].c;
		}
}

void afisare(){
	int i;
	fout << cost << '\n' << n - 1 << '\n';
	for(i = 0; i < n - 1; i++) fout << G[apm[i]].x << ' ' << G[apm[i]].y << '\n';
}

int Find(int x){
	int y, r = x;
	while(tata[r]) r = tata[r];
	while(tata[x]){
		y = x;
		x = tata[x];
		tata[y] = r;
	}
	return r;
}

void Union(int x, int y){
	tata[x] = y;
}