Pagini recente » Cod sursa (job #2977141) | Cod sursa (job #2378276) | Cod sursa (job #3232998) | Cod sursa (job #3146199) | Cod sursa (job #2500037)
#include <fstream>
#include <algorithm>
#include <vector>
#define int long long
using namespace std;
ifstream cin("apm.in");
ofstream cout("apm.out");
const int MMAX=200005;
const int NMAX=200005;
struct muchie
{ //structurile tbsa fie multipliide int
int u,v,cost,sel;
} ;
muchie v[NMAX];
int t[NMAX],h[NMAX];
bool cmp(const muchie &a,const muchie &b)
{
//e mai rapid cu & ca fac economie de memorie si nu mai sta sa copieze vaiabila ceva cred
return a.cost<b.cost;
}
int findset(int x)
{
while(x!=t[x])
x=t[x];
return x;
}
void unite(int x,int y)
{
if(h[x]==h[y])
++h[x],t[y]=x;
else
if(h[x]>h[y])
t[y]=x;
else
t[x]=y;
}
main()
{
int n,m,i,x,y,c,nr,z;
long long tcost=0;
cin>>n>>m;
for(i=1;i<=n;++i)
{
t[i]=i;
h[i]=1;
}
for(i=1;i<=m;++i)
{ //ca uneori nu citeste bine in struct
cin>>x>>y>>z;
v[i].u=x;
v[i].v=y;
v[i].cost=z;
v[i].sel=0;
}
sort(v+1,v+m+1,cmp);
nr=0;
for(i=1;i<=m&&nr<n-1;++i)
{
x=findset(v[i].u);
y=findset(v[i].v);
if(x!=y)
unite(x,y),++nr,v[i].sel=1,tcost+=v[i].cost;
}
cout<<tcost<<'\n';
for(i=1;i<=m;++i)
{
if(v[i].sel==1)
cout<<v[i].u<<" "<<v[i].v<<'\n';
}
return 0;
}