Pagini recente » Cod sursa (job #1683267) | Cod sursa (job #2332014) | Cod sursa (job #1867957) | Cod sursa (job #1857058) | Cod sursa (job #2470175)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
typedef pair < int, pair < int, int > > PIII;
const int NMAX = 2e5 + 5, MMAX = 4e5 + 5;
int N, M, X, Y, C, T[NMAX], ans;
PIII Edges[MMAX];
vector < pair < int, int > > Sol;
static inline int Find (int Node)
{
if(Node == T[Node])
return Node;
T[Node] = Find(T[Node]);
return T[Node];
}
static inline bool Unify (int X, int Y)
{
int XX = Find(X);
int YY = Find(Y);
if(XX == YY)
return false;
T[XX] = YY;
return true;
}
static inline void Read ()
{
f.tie(NULL);
f >> N >> M;
for(int i = 1; i <= M; ++i)
f >> Edges[i].second.first >> Edges[i].second.second >> Edges[i].first;
return;
}
int main()
{
Read();
for(int i = 1; i <= N; ++i)
T[i] = i;
sort(Edges + 1, Edges + M + 1);
for(int i = 1; i <= M; ++i)
if(Unify(Edges[i].second.first, Edges[i].second.second))
{
ans += Edges[i].first;
Sol.push_back(Edges[i].second);
}
g << ans << '\n';
g << (int)Sol.size() << '\n';
for(auto it : Sol)
g << it.first << ' ' << it.second << '\n';
return 0;
}