Pagini recente » Statistici Baras Nicholas Vladimir Laurentiu (Vladi.Baras) | Cod sursa (job #1545618) | Cod sursa (job #2369996) | Cod sursa (job #6783) | Cod sursa (job #1982689)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <set>
#include <vector>
#include <cstdio>
#include <string>
using namespace std;
#define ll long long
#define ull unsigned long long
/*------------------------------------------------------------------*/
ifstream f{ "apm.in" };
ofstream q{ "apm.out" };
typedef struct _EDGE
{
int x, y, c;
_EDGE(): x(0),y(0),c(0){}
_EDGE(int x, int y, int c): x(x), y(y), c(c){}
}EDGE;
EDGE edges[400006];
EDGE sol[200005];
int parent[200005];
int n, m;
bool acc(const EDGE& a, const EDGE& b)
{
return a.c < b.c;
}
int find(int x)
{
if (parent[x] == x) return x;
return parent[x] = find(parent[x]);
}
int Kruskal()
{
int all = 0;
int idx = 0;
int cost = 0;
while (all < n - 1)
{
if(find(edges[idx].x) != find(edges[idx].y))
{
cost += edges[idx].c;
sol[all] = edges[idx];
++all;
parent[find(edges[idx].x)] = find(edges[idx].y);
}
++idx;
}
return cost;
}
int main()
{
ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
f >> n >> m;
int x, y, c;
for(int i = 1; i <= n; ++i)
{
parent[i] = i;
}
for(int i = 0; i<m; ++i)
{
f >> x >> y >> c;
edges[i] = EDGE(x, y, c);
}
sort(edges, edges + m, acc);
int cost = Kruskal();
q << cost << "\n" << n - 1 << "\n";
for(int i = 0; i < n-1; ++i)
{
q << sol[i].x << " " << sol[i].y << "\n";
}
f.close();
q.close();
return 0;
}