Pagini recente » Clasamentul arhivei Infoarena Monthly | Cod sursa (job #1916653) | Cod sursa (job #3255458) | Cod sursa (job #2324268) | Cod sursa (job #1653149)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
struct vec
{
int x,y,cost;
}v[400005];
int n,m;
vector<pair<int,int> > sol;
int costmin,nrsol;
ifstream fin("apm.in");
ofstream fout("apm.out");
int TT[200005],RG[200005];
bool cmp(vec x,vec y)
{
return x.cost<y.cost;
}
void unite(int x,int y)
{
int par_A,par_B;
par_A=TT[x];
par_B=TT[y];
TT[par_A]=par_B;
}
int gas(int x)
{
while(x!=TT[x])
x=TT[x];
return x;
}
int main()
{ fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>v[i].x>>v[i].y>>v[i].cost;
}
sort(&v[1],&v[m+1],cmp);
for(int i=1;i<=n;i++)
{
TT[i]=i;
RG[i]=1;
}
int i=1;
while(nrsol<n-1)
{
int x=v[i].x;
int y=v[i].y;
int radx=gas(v[i].x);
int rady=gas(v[i].y);
if(radx!=rady)
{ nrsol++;
unite(radx,rady);
costmin=costmin+v[i].cost;
sol.push_back(make_pair(v[i].x,v[i].y));
}
i++;
}
fout<<costmin<<"\n";
fout<<n-1<<"\n";
for(int i=0;i<n-1;i++)
{
fout<<sol[i].first<<" "<<sol[i].second<<"\n";
}
}