Pagini recente » Cod sursa (job #2010630) | Istoria paginii utilizator/anahita | Istoria paginii utilizator/berret | Cod sursa (job #1276591) | Cod sursa (job #3150468)
#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
struct coord
{
int x, y, cost;
};
const int NMAX = 2e5 + 5, MMAX = 4e5 + 5;
int n, m, rang[NMAX], tata[MMAX];
long long suma = 0;
coord v[NMAX];
bool fcmp(coord x, coord y)
{
if(x.cost < y.cost)
return true;
return false;
}
int find_tata(int nod)
{
while(tata[nod] != -1)
nod = tata[nod];
return nod;
}
void citire()
{
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
cin >> v[i].x >> v[i].y >> v[i].cost;
}
}
int main()
{
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
citire();
for(int i = 1; i <= n; i++)
{
rang[i] = 1;
tata[i] = -1;
}
sort(v + 1, v + m + 1, fcmp);
vector<pair<int, int>> ans;
for(int i = 1; i <= m; i++)
{
int x = v[i].x, y = v[i].y, cost = v[i].cost;
int par1 = find_tata(v[i].x);
int par2 = find_tata(v[i].y);
if(par1 != par2)
{
ans.push_back({x, y});
if(rang[x] < rang[y])
{
swap(x, y);
swap(par1, par2);
}
rang[x] = rang[y];
if(x == y)
rang[x]++;
tata[par2] = par1;
suma += cost;
}
}
cout << suma << "\n" << ans.size() << "\n";
for(int i = 0; i < ans.size(); i++)
cout << ans[i].first << " " << ans[i].second << "\n";
}