Pagini recente » Cod sursa (job #98812) | Cod sursa (job #1409006) | Cod sursa (job #2127007) | Cod sursa (job #322465) | Cod sursa (job #2367539)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
pair <int,int>p[200001];
int n,m,t[200001],rang[200001],k,total;
struct muchie
{
int x,y,cost;
}v[400005];
bool cmp(muchie a,muchie b)
{
return a.cost<b.cost;
}
void citire()
{
f>>n>>m;
for(int i=1;i<=m;++i)
f>>v[i].x>>v[i].y>>v[i].cost;
for(int i=1;i<=n;++i)
t[i]=i,rang[i]=1;
sort(v+1,v+m+1,cmp);
}
int cauta(int nod)
{
while(t[nod]!=nod)
nod=t[nod];
return nod;
}
void unire(int x,int y)
{
if(rang[x]<rang[y])
t[x]=y;
if(rang[x]>rang[y])
t[y]=x;
if(rang[x]==rang[y])
{
t[x]=y;
rang[y]++;
}
}
void kruskal()
{
for(int i=1;i<=m;++i)
{
int tata_x=cauta(v[i].x);
int tata_y=cauta(v[i].y);
if(tata_x!=tata_y)
{
unire(tata_x,tata_y);
p[++k].first=v[i].x;
p[k].second=v[i].y;
total=total+v[i].cost;
}
}
}
void afisare()
{
g<<total<<endl<<k<<endl;
for(int i=1;i<=k;++i)
g<<p[i].second<<" "<<p[i].first<<endl;
}
int main()
{
citire();
kruskal();
afisare();
}