Pagini recente » Cod sursa (job #2200260) | Cod sursa (job #2157088) | Cod sursa (job #575172) | Cod sursa (job #3182707) | Cod sursa (job #1261110)
#include <fstream>
#include <algorithm>
#define NMAX 200004
#define MMAX 400004
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
int n, m;
struct muchie
{
int x, y;
double cost;
};
muchie M[MMAX];//lista muchiilor
int conex[NMAX];
int APM[NMAX];//indicii celor n-1 muchii selectate
double cost_apm;
void citire();
bool ord(muchie A, muchie B);
void initializare();
void kruskal();
void unific(int x, int y);
void afisare();
int main()
{
citire();
sort(M+1, M+m+1, ord);
initializare();
kruskal();
afisare();
return 0;
}
void citire()
{
int i;
fin>>n>>m;
for(i=1;i<=m;i++)
fin>>M[i].x>>M[i].y>>M[i].cost;
}
bool ord(muchie A, muchie B)
{
return A.cost<=B.cost;
}
void initializare()
{
int i;
for(i=1;i<=n;i++)
conex[i]=i;
}
void kruskal()
{
int i=0, nrm=0;
while(nrm<n-1)
{
++i;
while(conex[M[i].x]==conex[M[i].y])
++i;
unific(M[i].x, M[i].y);
APM[++nrm]=i;
cost_apm+=M[i].cost;
}
}
void unific(int x, int y)
{
int i;
int a, b;
if(conex[x]<=conex[y])
{
a=conex[x];
b=conex[y];
}
else
{
a=conex[y];
b=conex[x];
}
for(i=1;i<=n;i++)
if(conex[i]==b)
conex[i]=a;
}
void afisare()
{
int i;
fout<<cost_apm<<'\n'<<n-1<<'\n';
for(i=1;i<n;i++)
fout<<M[APM[i]].x<<' '<<M[APM[i]].y<<'\n';//fout<<"["<<M[APM[i]].x<<", "<<M[APM[i]].y<<"] "<<' ';
}