Cod sursa(job #381518)

Utilizator lorandCsorba Lorand-Alexandru lorand Data 10 ianuarie 2010 20:21:34
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
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;
}