Pagini recente » Cod sursa (job #3350411) | Cod sursa (job #3335764) | Cod sursa (job #3349620) | Cod sursa (job #355179) | Cod sursa (job #3337052)
#include <algorithm>
#include <fstream>
#include <iostream>
#include <queue>
#include <vector>
#include <tuple>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
struct Edge {
int u,v,cost;
bool operator<(const Edge& other) const {
return cost < other.cost;
}
};
vector<int> rep;
int find(int i) {
if (rep[i] == i) {
return i;
}
return rep[i] = find(rep[i]);
}
void unite(int x, int y) {
int rootx = find(x);
int rooty = find(y);
rep[rooty] = rootx;
}
int main(){
int n,m;
fin >> n>>m;
vector<Edge> muchii;
vector<Edge> rez;
rep.resize(n+1);
int costtotal=0;
for (int i = 0;i<m;i++) {
int u,v,c;
fin>>u>>v>>c;
muchii.push_back({u,v,c});
}
for (int i = 1; i<=n; i++) {
rep[i] = i;
}
priority_queue< tuple<int,int,int>, vector<tuple<int,int,int>>, greater<> > pq; // cost, nod, tata
for (auto e : muchii) {
pq.emplace(e.cost, e.u, e.v);
}
while (!pq.empty()) {
auto [cost, u, v] = pq.top();
pq.pop();
if (find(u) != find(v)) {
unite(u,v);
rez.push_back({u,v,cost});
costtotal+=cost;
}
}
fout<<costtotal<<endl;
for (auto r : rez) {
fout<<r.u<<" "<<r.v<<endl;
}
return 0;
}