Pagini recente » Cod sursa (job #2886337) | Cod sursa (job #1991629) | Cod sursa (job #2297537) | Cod sursa (job #1577352) | Cod sursa (job #3039356)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream cin("apm.in");
ofstream cout("apm.out");
struct muchie {
int x, y;
int cost;
bool operator<(const muchie& other) const {
return cost < other.cost;
}
} v[400005];
int arb[200005];
int h[200005];
bool query(int x, int y) {
int p1 = x;
vector<int> c1;
while (arb[p1] != p1) {
c1.push_back(p1);
p1 = arb[p1];
}
int p2 = y;
vector<int> c2;
while (arb[p2] != p2) {
c2.push_back(p2);
p2 = arb[p2];
}
for (int i : c1) arb[i] = p1;
for (int i : c2) arb[i] = p2;
return p1 == p2;
}
void merge(int x, int y) {
int p1 = x;
vector<int> c1;
while (arb[p1] != p1) {
c1.push_back(p1);
p1 = arb[p1];
}
int p2 = y;
vector<int> c2;
while (arb[p2] != p2) {
c2.push_back(p2);
p2 = arb[p2];
}
if (h[p2] == h[p1]) {
h[p1]++;
arb[p2] = p1;
for (int i : c2) arb[i] = p1;
}
else if (h[p2] > h[p1]) {
arb[p1] = p2;
for (int i : c1) arb[i] = p2;
}
else if (h[p1] > h[p2]) {
arb[p2] = p1;
for (int i : c2) arb[i] = p1;
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> v[i].x >> v[i].y >> v[i].cost;
}
sort(v + 1, v + m + 1);
for (int i = 1; i <= n; i++) {
arb[i] = i;
}
int ans1 = 0;
vector<int> ans2;
for (int i = 1; i <= m; i++) {
if (!query(v[i].x, v[i].y)) {
ans1 += v[i].cost;
merge(v[i].x, v[i].y);
ans2.push_back(i);
}
}
cout << ans1 << '\n' << ans2.size() << '\n';
for (int i : ans2) {
cout << v[i].x << ' ' << v[i].y << '\n';
}
return 0;
}