Pagini recente » Cod sursa (job #2647053) | Cod sursa (job #2428563) | Cod sursa (job #1266154) | Cod sursa (job #2891916) | Cod sursa (job #1922517)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream cin("apm.in");
ofstream cout("apm.out");
struct co{ int a,b,cost; };
int n,m,i,j,c;
int a[400002];
co Gf[400002];
int Pa[200002],Rk[200002];
int find_p(int x)
{
if(Pa[x]!=x)
Pa[x]=find_p(Pa[x]);
return Pa[x];
}
void Union(int a,int b)
{
int ix=find_p(a);
int iy=find_p(b);
if(Rk[ix]>Rk[iy])
Pa[iy]=ix;
if(Rk[ix]<Rk[iy])
Pa[ix]=iy;
if(Rk[ix]==Rk[iy])
{
Pa[iy]=ix;
++Rk[ix];
}
}
int IsCycle(int a,int b)
{
int ix=find_p(a);
int iy=find_p(b);
if(ix==iy)
return 1;
return 0;
}
void Afisare(int nr)
{
int costa=0;
for(int k=1;k<=nr;++k)
costa+=Gf[a[k]].cost;
cout<<costa<<'\n'<<n-1<<'\n';
for(int k=1;k<=nr;++k)
cout<<Gf[a[k]].b<<' '<<Gf[a[k]].a<<'\n';
}
int Kruskal()
{
int nrm=0;
for(int k=1;k<=m;++k)
if(!IsCycle(Gf[k].a,Gf[k].b))
{
a[++nrm]=k;
Union(Gf[k].a,Gf[k].b);
}
return nrm;
}
bool Pred(co x, co z)
{
if(x.cost<z.cost)
return 1;
return 0;
}
int main()
{
cin>>n>>m;
for(int k=1;k<=m;++k)
{
cin>>i>>j>>c;
Pa[i]=i;
Pa[j]=j;
Gf[k].a=i;
Gf[k].b=j;
Gf[k].cost=c;
}
sort(Gf+1,Gf+m+1,Pred);
Afisare(Kruskal());
return 0;
}