Pagini recente » Cod sursa (job #673574) | Monitorul de evaluare | Cod sursa (job #1272889) | Diferente pentru utilizator/tvlad intre reviziile 30 si 29 | Cod sursa (job #3175064)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int n,m,x[400002],y[400002],c[400002],t[200002],ind[400002],cnt,vans[200002],sol,g[400002];
int tata(int x)
{
if(t[x]==x) return x;
t[x]=tata(t[x]);
return t[x];
}
void reuniune(int a,int b)
{
if(g[b]>=g[a]){t[tata(a)]=tata(b);g[b]=g[b]+g[a];}
else{t[tata(b)]=tata(a);g[a]=g[b]+g[a];}
}
bool cmpf(int a, int b)
{
return(c[a]<c[b]);
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>x[i]>>y[i]>>c[i];
ind[i]=i;
g[i]=1;
}
for(int i=1;i<=n;i++)
{
t[i]=i;
}
sort(ind+1,ind+1+m,cmpf);
for(int i=1;i<=m;i++)
{
if(tata(x[ind[i]])!=tata(y[ind[i]]))
{
sol=sol+c[ind[i]];
reuniune(x[ind[i]],y[ind[i]]);
cnt++;
vans[cnt]=ind[i];
}
}
fout<<sol<<'\n'<<cnt<<'\n';
for(int i=1;i<=cnt;i++)
{
fout<<x[vans[i]]<<" "<<y[vans[i]]<<'\n';
}
fin.close();
fout.close();
return 0;
}