刚拿到题目,就想到将集合看成一个独立点,求次MST。再对每个集合内的所有点求MST..
可惜比赛的时候没过这题。。错误原来在 空的集合 是不需要连接(这个没考虑所以出错了)
我用了prim算法 没什么优化..903ms过的.(可以用堆优化下)
 #include<iostream>
#include<iostream>
 #include<cmath>
#include<cmath>
 using namespace std;
using namespace std;
 const double inf= 1000000000;
const double inf= 1000000000;
 double math[105][105],matx[105][105];
double math[105][105],matx[105][105];
 struct point
struct point


 {
{
 double x,y,z;
    double x,y,z;
 };
};
 point hy[105][105];
point hy[105][105];
 int num[105],coll[105];
int num[105],coll[105];
 bool eq(point e,point d)
bool eq(point e,point d)


 {
{
 if(abs(e.x-d.x)<1e-6&&abs(e.y-d.y)<1e-6&&abs(e.z-d.z)<1e-6)
    if(abs(e.x-d.x)<1e-6&&abs(e.y-d.y)<1e-6&&abs(e.z-d.z)<1e-6)
 return true;
        return true;
 return false;
    return false;
 }
}
 double prim(double mat[][105],int n)
double prim(double mat[][105],int n)


 {
{
 double dist[105];
    double dist[105];
 bool visit[105];
    bool visit[105];
 for(int i=0;i<n;i++)
    for(int i=0;i<n;i++)
 dist[i]=inf;
        dist[i]=inf;
 memset(visit,false,sizeof(visit));
    memset(visit,false,sizeof(visit));
 dist[0]=0;
    dist[0]=0;
 double sum=0;
    double sum=0;
 for(int i=0;i<n;i++)
    for(int i=0;i<n;i++)

 
     {
{
 int minpos=-1;double minv=inf;
        int minpos=-1;double minv=inf;
 for(int j=0;j<n;j++)
        for(int j=0;j<n;j++)

 
         {
{
 if(!visit[j]&&(minpos==-1||dist[j]<minv))
            if(!visit[j]&&(minpos==-1||dist[j]<minv))

 
             {
{
 minpos=j;
                minpos=j;
 minv=dist[j];
                minv=dist[j];
 }
            }
 }
        }
 visit[minpos]=true;
        visit[minpos]=true;
 sum+=dist[minpos];
        sum+=dist[minpos];
 for(int j=0;j<n;j++)
        for(int j=0;j<n;j++)

 
         {
{
 if(!visit[j]&&dist[j]>mat[minpos][j])
            if(!visit[j]&&dist[j]>mat[minpos][j])
 dist[j]=mat[minpos][j];
                dist[j]=mat[minpos][j];
 }
        }
 }
    }
 return sum;
    return sum;
 }
}
 int main()
int main()


 {
{
 int n,m;
    int n,m;
 while(cin>>n)
    while(cin>>n)

 
     {
{
 cin>>m;
        cin>>m;
 memset(num,0,sizeof(num));
        memset(num,0,sizeof(num));
 for(int i=0;i<m;i++)
        for(int i=0;i<m;i++)

 
         {
{
 point d;
            point d;
 int id,j;
            int id,j;
 cin>>d.x>>d.y>>d.z>>id;
            cin>>d.x>>d.y>>d.z>>id;
 for(j=0;j<num[id-1];j++)
            for(j=0;j<num[id-1];j++)

 
             {
{
 if(eq(hy[id-1][j],d)) break;
                if(eq(hy[id-1][j],d)) break;
 }
            }
 if(j==num[id-1])
            if(j==num[id-1])

 
             {
{
 hy[id-1][num[id-1]]=d;
                hy[id-1][num[id-1]]=d;
 num[id-1]++;
                num[id-1]++;
 }
            }
 }
        }
 memset(math,0,sizeof(math));
        memset(math,0,sizeof(math));
 int len=0;
        int len=0;
 for(int i=0;i<n;i++)
        for(int i=0;i<n;i++)
 if(num[i]!=0)
            if(num[i]!=0)
 coll[len++]=i;
                coll[len++]=i;
 for(int i=0;i<len;i++)
        for(int i=0;i<len;i++)
 for(int j=0;j<len;j++)
            for(int j=0;j<len;j++)

 
                 {
{
 if(i==j)
                    if(i==j)

 
                     {
{
 math[i][j]=0;
                        math[i][j]=0;
 continue;
                        continue;
 }
                    }
 math[i][j]=abs((double)(num[coll[i]]-num[coll[j]]))*abs((double)(coll[i]-coll[j]));
                    math[i][j]=abs((double)(num[coll[i]]-num[coll[j]]))*abs((double)(coll[i]-coll[j]));
 }
                }
 double sum=0;
        double sum=0;
 sum+=prim(math,len);
        sum+=prim(math,len);
 for(int i=0;i<n;i++)
        for(int i=0;i<n;i++)

 
         {
{
 point it,it2;
            point it,it2;
 int l1,l2;
            int l1,l2;
 memset(matx,0,sizeof(matx));
            memset(matx,0,sizeof(matx));
 for(l1=0;l1<num[i];l1++)
            for(l1=0;l1<num[i];l1++)

 
             {
{
 for(l2=0;l2<num[i];l2++)
                for(l2=0;l2<num[i];l2++)

 
                 {
{
 if(l1==l2)
                    if(l1==l2)

 
                     {
{
 matx[l1][l2]=0;
                        matx[l1][l2]=0;
 continue;
                        continue;
 }
                    }
 it=hy[i][l1];
                    it=hy[i][l1];
 it2=hy[i][l2];
                    it2=hy[i][l2];
 double l=(it.x-it2.x)*(it.x-it2.x)+(it.y-it2.y)*(it.y-it2.y)+(it.z-it2.z)*(it.z-it2.z);
                    double l=(it.x-it2.x)*(it.x-it2.x)+(it.y-it2.y)*(it.y-it2.y)+(it.z-it2.z)*(it.z-it2.z);
 matx[l1][l2]=sqrt(l);
                    matx[l1][l2]=sqrt(l);
 }
                }
 }
            }
 double v=prim(matx,num[i]);
            double v=prim(matx,num[i]);
 sum+=v;
            sum+=v;
 }
        }
 printf("%.4lf\n",sum);
        printf("%.4lf\n",sum);
 }
    }
 return 0;
    return 0;
 }
}

posted on 2009-05-02 20:37 
米游 阅读(388) 
评论(0)  编辑 收藏 引用  所属分类: 
ACM