Pagini recente » Cod sursa (job #1902866) | Cod sursa (job #974229) | Cod sursa (job #2593348) | Istoria paginii runda/7312 | Cod sursa (job #733545)
Cod sursa(job #733545)
#include <cstdio>
#include <algorithm>
#include <vector>
#define EMax 400005
#define NMax 200005
using namespace std;
struct Edge
{
int x, y, c;
inline bool operator () (const Edge &a, const Edge &b)
{
return a.c<b.c;
}
};
Edge E[EMax];
int N, NE, F[NMax], Rank[NMax], S;
vector <int> SE;
inline int Find (int X)
{
int Root=X;
for (; F[Root]; Root=F[Root]);
for (int Y; X!=Root; Y=F[X], F[X]=Root, X=Y);
return Root;
}
inline bool Merge (int X, int Y)
{
int RX=Find (X), RY=Find (Y);
if (RX==RY) return false;
if (Rank[RX]<Rank[RY])
{
F[RX]=RY; return true;
}
if (Rank[RX]>Rank[RY])
{
F[RY]=RX; return true;
}
++Rank[RX]; F[RY]=RX;
return true;
}
void Kruskal ()
{
sort (E, E+NE, Edge ());
for (int i=0; i<NE; ++i)
{
int X=E[i].x, Y=E[i].y, C=E[i].c;
if (Merge (X, Y))
{
S+=C; SE.push_back (i);
}
}
}
void Read ()
{
freopen ("apm.in", "r", stdin);
scanf ("%d %d", &N, &NE);
for (int i=0; i<NE; ++i)
{
scanf ("%d %d %d", &E[i].x, &E[i].y, &E[i].c);
}
}
void Print ()
{
freopen ("apm.out", "w", stdout);
printf ("%d\n%d\n", S, N-1);
for (; !SE.empty (); SE.pop_back ())
{
printf ("%d %d\n", E[SE.back ()].x, E[SE.back ()].y);
}
}
int main()
{
Read ();
Kruskal ();
Print ();
return 0;
}