Cod sursa(job #2195756)

Utilizator flibiaVisanu Cristian flibia Data 17 aprilie 2018 12:22:41
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <bits/stdc++.h>

using namespace std;

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

struct edge{
	int x, y, c;
};

int n, m, x, y, c, vf, dad[200100], rs;
edge E[400100], sol[200100];

int find(int x){
	return x == dad[x] ? x : dad[x] = find(dad[x]);
}

void join(int x, int y){
	dad[find(x)] = find(y);
}

bool cmp(const edge &a, const edge &b){
	return a.c < b.c;
}

int main(){
	in >> n >> m;
	for(int i = 1; i <= m; i++){
		in >> x >> y >> c;
		E[i] = {x, y, c};
	}
	for(int i = 1; i <= n; i++)
		dad[i] = i;
	sort(E + 1, E + m + 1, cmp);
	for(int i = 1; i <= m; i++){
		x = E[i].x;
		y = E[i].y;
		if(find(x) != find(y)){
			rs += E[i].c;		
			sol[++vf] = E[i];
			join(x, y);
		}
	}
	out << rs << '\n' << n - 1;
	for(int i = 1; i < n; i++)
		out << '\n' << sol[i].x << ' ' << sol[i].y;
	return 0;
}