Pagini recente » Cod sursa (job #384874) | Cod sursa (job #875960) | Cod sursa (job #2797797) | Cod sursa (job #2669847) | Cod sursa (job #385525)
Cod sursa(job #385525)
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 200001
#define M 400001
int x[M],y[M],ind[M],n,m,cost,sol[N],gr[N],rang[N];
short int c[M];
bool compar(const int &i, const int &j)
{
return c[i]<c[j];
}
void citire()
{
freopen("apm.in","r",stdin);
freopen("apm.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i=1; i<=m; ++i)
{
scanf("%d%d%hd",&x[i],&y[i],&c[i]);
ind[i]=i;
}
sort(ind+1,ind+m+1,compar);
}
int find(int x)
{
if (gr[x]!=x)
gr[x]=find(gr[x]);
return gr[x];
}
void unesc(int x,int y)
{
if (rang[x]<rang[y])
gr[x]=y;
else
{
gr[y]=x;
rang[x]+=(rang[x]==rang[y]);
}
}
void apm()
{
for (int i=1; i<=n; ++i)
gr[i]=i,rang[i]=1;
for (int i=1;i<=m; ++i)
{
int x1=find(x[ind[i]]),y1=find(y[ind[i]]);
if (x1!=y1)
{
unesc(x1,y1);
cost+=c[ind[i]];
sol[++sol[0]]=ind[i];
}
}
}
void afis()
{
printf("%d\n%d\n",cost,sol[0]);
for (int i=1; i<=sol[0]; ++i)
printf("%d %d\n",x[sol[i]],y[sol[i]]);
}
int main()
{
citire();
apm();
afis();
return 0;
}