Cod sursa(job #3239580)

Utilizator andrei_botorogeanuBotorogeanu Andrei andrei_botorogeanu Data 6 august 2024 17:36:41
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <iostream>
#include <algorithm>
#include <vector>
#include <fstream>
#define FIN "apm.in"
#define FOUT "apm.out"
using namespace std;

struct Edge {
	int u, v, cost;
};
int n, m, total_cost;
class UnionFind
{
	int nodes;
	vector<int> parent;
	vector<int> rank;
public:

	UnionFind(int n): nodes(n)
	{
		parent.resize(n, 0);
		rank.resize(n, 0);

		for(int i=1; i<=n; i++) parent[i] = i;
	}

	int find(int u) { // caută rădăcina unde se află u

		if(u != parent[u]) {
			parent[u] = find( parent[u] );
		}	
		return parent[u];
	} 
	
	void Union(int u, int v) {

		int rootX = find(u);
		int rootY = find(v);

		if(rootX != rootY) {
			if( rank[rootX] < rank[rootY] ) {
				parent[rootX] = rootY;
			} else if( rank[rootX] > rank[rootY] ){
				parent[rootY] = rootX;
			} else {
				parent[rootY] = rootX;
				rank[rootX]++;
			}
// funcția este de a unifica două noduri din doi arbori diferiți		
		}
	}

};

bool compareEdge(const Edge& a, const Edge& b) {

	return a.cost < b.cost;
}

int main()
{
	freopen(FIN, "r", stdin);

	cin >> n >> m;	
	vector<Edge> edge(m);
	for(int i=0; i<m; i++) 
		cin >> edge[i].u >> edge[i].v >> edge[i].cost;	
	 
	sort(edge.begin(), edge.end(), compareEdge);
	
	UnionFind uf( n + 1 );

	vector<Edge> mst; // Minimum Spanning Tree

	for(const Edge& ed: edge) {
		if( uf.find(ed.u) != uf.find(ed.v) ) {
			uf.Union(ed.u, ed.v);
			mst.push_back(ed);
			total_cost = total_cost + ed.cost;
		}
	}

	cout << total_cost << " " << mst.size() << "\n";

	for(const Edge& ed: mst ) 
		cout << ed.u << " " << ed.v<<"\n"; 
	/*

for(vector<Edge>::iterator it = edge.begin(); it != edge.end(); it++) {

            cout<<"muchia ["<<(*it).u<<","<<(*it).v<<"] si COST="<<(*it).cost<<"\n";
  }
*/
	return 0;
}