Pagini recente » Cod sursa (job #2215996) | Cod sursa (job #2796757) | Cod sursa (job #2158649) | Cod sursa (job #687320) | Cod sursa (job #381518)
Cod sursa(job #381518)
using namespace std;
#include<fstream>
#include<algorithm>
#include<cmath>
struct xOy
{
int x;
int y;
};
struct muchie
{
int i;
int j;
double cost;
friend double operator < (const muchie &a, const muchie &b)
{
return a.cost<b.cost;
}
};
int n,m,nm,*h,*t;
double total;
xOy *punct;
muchie *graf;
void kruskal();
void distante(int);
int radacina(int);
int main()
{
int i,j;
ifstream fin("desen.in");
fin>>n>>m;
punct=new xOy[n+1];
for(i=1;i<=n;++i)
fin>>punct[i].x>>punct[i].y;
fin.close();
ofstream fout("desen.out");
fout<<fixed<<total<<'\n';
graf=new muchie[n*(n-1)/2+5];
h=new int[n+1];
t=new int[n+1];
for(i=2;i<=n;++i)
{
distante(i);
kruskal();
fout<<fixed<<total<<'\n';
total=0;
}
fout.close();
return 0;
}
void distante(int n)
{
int i,xx,yy;
for(i=1;i<n;++i)
{
graf[++nm].i=i;
graf[nm].j=n;
xx=punct[n].x-punct[i].x;
yy=punct[n].y-punct[i].y;
graf[nm].cost=sqrt(xx*xx+yy*yy);
}
}
void kruskal()
{
int i,ri,rj;
for(i=1;i<=n;++i)
h[i]=t[i]=0;
sort(graf+1,graf+nm+1);
for(i=1;i<=nm;++i)
{
ri=radacina(graf[i].i);
rj=radacina(graf[i].j);
if(ri!=rj)
{
total+=graf[i].cost;
if(h[ri]<h[rj])
t[ri]=rj;
else
if(h[rj]<h[ri])
t[rj]=ri;
else
{
t[ri]=rj;
++h[rj];
}
}
}
}
int radacina(int x)
{
int y=x,aux;
while(t[x])
x=t[x];
while(t[y])
{
aux=t[y];
t[y]=x;
y=aux;
}
return x;
}