Pagini recente » Cod sursa (job #147434) | Cod sursa (job #2236973) | Cod sursa (job #968701) | Cod sursa (job #1756102) | Cod sursa (job #2371725)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <queue>
#include <map>
#include <deque>
#define ll long long
#define lsb(x) (x & -x)
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
struct Data {
int a, b, cost;
bool operator< (const Data &other) const {
return cost < other.cost;
}
};
int findad(int i, vector<int> &dad) {
if(dad[i] == i)
return i;
return dad[i] = findad(dad[i], dad);
}
bool link(int a, int b, vector<int> &dad, vector<int> &len) {
a = findad(a, dad);
b = findad(b, dad);
if(a == b)
return 0;
if(len[a] > len[b]) {
dad[b] = a;
} else if(len[a] < len[b]){
dad[a] = b;
} else {
dad[a] = b;
len[b] ++;
}
return 1;
}
int main() {
int n, m;
in >> n >> m;
vector<Data> edge(m + 1, {0, 0, 0});
for(int i = 1; i <= m; i ++)
in >> edge[i].a >> edge[i].b >> edge[i].cost;
sort(edge.begin() + 1, edge.end());
vector<int> dad(n + 1, 0);
vector<int> len(n + 1, 1);
for(int i = 1; i <= n; i ++)
dad[i] = i;
int sol = 0, sz = 0;
vector<bool> toshow(m + 1, 0);
for(int i = 1; i <= m; i ++) {
if(link(edge[i].a, edge[i].b, dad, len)) {
sol += edge[i].cost;
toshow[i] = 1;
sz ++;
}
}
out << sol << "\n";
out << sz << "\n";
for(int i = 1; i <= m; i ++)
if(toshow[i])
out << edge[i].a << " " << edge[i].b << "\n";
return 0;
}