Pagini recente » Statistici corina geboiu (corigeb) | Cod sursa (job #2034640) | Istoria paginii utilizator/laryana | Diferente pentru utilizator/mocke intre reviziile 10 si 11 | Cod sursa (job #2952893)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int n, m;
vector<tuple<int, int, int>> edges;
vector<pair<int, int>> sol;
long long rez;
struct DisjointSetUnion
{
vector<int> p;
vector<int> size;
void init()
{
p.assign(n + 1, 0);
size.assign(n + 1, 0);
for (int i = 1; i <= n; i++)
{
p[i] = i;
size[i] = 1;
}
}
int repr(int u)
{
if (u != p[u])
{
p[u] = repr(p[u]);
}
return p[u];
}
bool same(int u, int v)
{
return (repr(u) == repr(v));
}
void unite(int u, int v)
{
int repr_u = repr(u);
int repr_v = repr(v);
if (size[repr_u] < size[repr_v])
{
swap(repr_u, repr_v);
}
p[repr_v] = repr_u;
size[repr_u] += size[repr_v];
}
} DSU;
bool cmp(tuple<int, int, int> a, tuple<int, int, int> b)
{
return get<2>(a) < get<2>(b);
}
void kruskal()
{
sort(edges.begin(), edges.end(), cmp);
DSU.init();
for (auto edge : edges)
{
if (!DSU.same(get<0>(edge), get<1>(edge)))
{
sol.push_back({get<0>(edge), get<1>(edge)});
rez += get<2>(edge);
DSU.unite(get<0>(edge), get<1>(edge));
}
}
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= m; i++)
{
int a, b, c;
fin >> a >> b >> c;
edges.push_back({a, b, c});
}
kruskal();
fout << rez << '\n';
fout << n - 1 << '\n';
for (auto edge : sol)
{
fout << edge.first << ' ' << edge.second << '\n';
}
return 0;
}