Pagini recente » Autentificare | Istoria paginii preoni-2008/runda-3/10 | Cod sursa (job #1731792) | Cod sursa (job #2510197) | Cod sursa (job #3149086)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
const int NMax = 400005;
int n,m,x,y,c,tata[NMax],rang[NMax],k=0,Total=0;
pair<int,int> M[NMax];
struct Edge{
int x,y,c;
}v[NMax];
bool cmp(Edge a, Edge b)
{
return a.c < b.c;
}
int Find(int nod)
{
while(tata[nod]!=nod)
nod=tata[nod];
return nod;
}
void Unite(int x,int y)
{
if(rang[x]<rang[y])
tata[x]=y;
if(rang[y]<rang[x])
tata[y]=x;
if(rang[x]==rang[y])
{
tata[x]=y;
rang[y]++;
}
}
void Solve()
{
for(int i=1; i<=m; i++)
{
int tatal_x = Find(v[i].x);
int tatal_y = Find(v[i].y);
if(tatal_x!=tatal_y)
{
Unite(tatal_x,tatal_y);
M[++k].first = v[i].x;
M[k].second = v[i].y;
Total = Total + v[i].c;
}
}
}
int main()
{
f >> n >> m;
for(int i=1; i<=m; i++)
{
f >> v[i].x >> v[i].y >> v[i].c;
}
sort(v+1,v+m+1,cmp);
for(int i=1; i<=m; i++)
{
tata[i]=i;
rang[i]=1;
}
Solve();
g<<Total<<"\n";
g<<n-1<<"\n";
for(int i=1; i<=k; i++)
g<<M[i].first<<" "<<M[i].second<<"\n";
return 0;
}