Pagini recente » Cod sursa (job #1280446) | Cod sursa (job #1935138) | Cod sursa (job #1153442) | Cod sursa (job #193493) | Cod sursa (job #3239580)
#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;
}