Pagini recente » Cod sursa (job #3146519) | Cod sursa (job #2822623) | Cod sursa (job #2305275) | Cod sursa (job #1842522) | Cod sursa (job #729483)
Cod sursa(job #729483)
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define MMAX 400005
#define NMAX 200005
FILE *f=fopen("apm.in","r");
FILE *g=fopen("apm.out","w");
struct muchie{ long x,y,c;};
struct cmp{
bool operator() ( muchie v1, muchie v2)
{ return v1.c<v2.c;}
};
long n,m,cost,nrm,R[NMAX],rang[NMAX];
muchie v[MMAX];
vector<long> sol;
long multime(long nod)
{
long root=nod,aux;
while(R[root]!=root)
root=R[root];
while(R[nod]!=root)
{ aux=nod;
nod=R[nod];
R[aux]=root;
}
return root;
}
void reuneste(long r1,long r2)
{
if (rang[r1]>rang[r2])
{R[r2]=r1;
return;}
if (rang[r1]<rang[r2])
{R[r1]=r2;
return ;}
rang[r1]++;
R[r2]=r1;
}
void apm()
{
for (long i=1;i<=m;i++)
{ long a=multime(v[i].x);
long b=multime(v[i].y);
if (a==b) continue;
cost+=v[i].c;
nrm++;
sol.push_back(i);
reuneste(a,b);
}
}
int main()
{
fscanf(f,"%ld%ld",&n,&m);
for (long i=1;i<=m;i++)
fscanf(f,"%ld%ld%ld",&v[i].x,&v[i].y,&v[i].c);
sort(v+1,v+m+1, cmp() );
for (long i=1;i<=n;i++)
R[i]=i;
apm();
fprintf(g,"%ld\n%ld\n",cost,nrm);
for (long i=0;i<sol.size();i++)
fprintf(g,"%ld %ld\n",v[ sol[i] ].x,v[ sol[i] ].y);
return 0;}