Pagini recente » Cod sursa (job #3221056) | Cod sursa (job #3172371) | Cod sursa (job #1594933) | Cod sursa (job #1936279) | Cod sursa (job #1374352)
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
struct vec3 {
int x, y, z;
vec3(int _x, int _y, int _z) {
x = _x;
y = _y;
z = _z;
}
bool operator<(vec3 v) {
return this->z < v.z;
}
};
const int MAXN = 200005;
const int MAXM = 400005;
std::ifstream f("apm.in");
std::ofstream g("apm.out");
std::vector<vec3> edge;
std::vector<int> G[MAXN];
std::bitset<MAXN> used;
int parent[MAXN];
int n, m;
int find(int x)
{
int r = x;
while (r != parent[r]) {
r = parent[r];
}
while (x != r) {
int aux = parent[x];
parent[x] = r;
x = aux;
}
return r;
}
void unite(int x, int y)
{
x = find(x);
y = find(y);
parent[x] = y;
}
int main()
{
f >> n >> m;
for (int i = 0, x, y, z; i < m; i++) {
f >> x >> y >> z;
edge.push_back(vec3(x, y, z));
G[x].push_back(y);
G[y].push_back(x);
}
for (int i = 1; i <= n; i++) {
parent[i] = i;
}
std::sort(edge.begin(), edge.end());
int sol = 0, count = 0;
for (int i = 0; i < m; i++) {
if (find(edge[i].x) != find(edge[i].y)) {
unite(edge[i].x, edge[i].y);
used[i] = true;
sol += edge[i].z;
count++;
}
}
g << sol << '\n' << count << '\n';
for (int i = 0; i < m; i++) {
if (used[i] == true) {
g << edge[i].x << ' ' << edge[i].y << '\n';
}
}
g.flush();
//system("pause");
f.close();
g.close();
return 0;
}