Pagini recente » Cod sursa (job #762138) | Cod sursa (job #2692098) | Cod sursa (job #1388535) | Cod sursa (job #2325826) | Cod sursa (job #2917042)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in ("kruskal.in");
ofstream out ("kruskal.out");
const int max_size1 = 2e5 + 1, max_size2 = 4e5 + 1;
struct str{
int x, y, cost;
};
int t[max_size1], ind[max_size2];
vector <str> mc, apm;
bool cmp (int a, int b)
{
return mc[a].cost < mc[b].cost;
}
int rad (int a)
{
if (t[a] == a)
{
return a;
}
return t[a] = rad(t[a]);
}
void uniune (int a, int b)
{
t[rad(a)] = rad(b);
}
int main ()
{
int n, m;
in >> n >> m;
for (int i = 0; i < m; i++)
{
str aux;
in >> aux.x >> aux.y >> aux.cost;
mc.push_back(aux);
ind[i] = i;
}
for (int i = 1; i <= n; i++)
{
t[i] = i;
}
sort(&ind[0], &ind[m], cmp);
int ans = 0;
for (int i = 0; i < m; i++)
{
if (rad(mc[ind[i]].x) != rad(mc[ind[i]].y))
{
ans += mc[ind[i]].cost;
uniune(mc[ind[i]].x, mc[ind[i]].y);
apm.push_back(mc[ind[i]]);
}
}
out << ans << '\n' << apm.size() << '\n';
for (auto f : apm)
{
out << f.x << " " << f.y << '\n';
}
in.close();
out.close();
return 0;
}