我想说我是多久没有写最小生成树算法了。。。。竟然让我写了两个小时,因为写出来的都是漏洞!!!!
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std;
typedef struct fun
{
double x,y,z,r;
}rr;
fun a[105];
bool vis[105];
double len[105][105];
int cout,n;
int main()
{
int i,j;
while(1)
{
cout=0;
double sum=0;
scanf("%d",&n);
if(n==0)
break;
for(i=1; i<=n; i++)
{
scanf("%lf%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z,&a[i].r);
vis[i]=false;
}
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
len[i][j]=len[j][i]=sqrt(pow(a[i].x-a[j].x,2)+pow(a[i].y-a[j].y,2)+pow(a[i].z-a[j].z,2))-a[i].r-a[j].r;
/* for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
printf("%lf ",len[i][j]);
printf("\n");
}*/
vis[1]=true;
cout=1;
while(cout<n)
{
double Max=100000000;
int k;
for(j=2; j<=n; j++)
{
if(len[j][1]<Max && vis[j]==false)
{
Max=len[j][1];
k=j;
}
}
vis[k]=true;
cout++;
if(Max>0)
sum+=Max;
for(j=2; j<=n; j++)
{
if(vis[j]==false && len[k][j]<len[j][1] && k!=j)
{
len[j][1]=len[k][j];
}
}
// for(i=1; i<=n; i++)
// printf("%lf\n",len[i][1]);
}
printf("%0.3lf\n",sum);
}
return 0;
}
下面的代码是比较麻烦的,但是是我第一反应写出来的,但是一直WA,费了好大的劲才知道错在哪,是利用队列,然后对于队列没有设立标记数组,然后可能对于一个元素有重复进入队列的,然后cout重复计数,然后导致的错误,下面是改后的代码!
#include<cmath> #include<cstdio> #include<queue> using namespace std; typedef struct fun { double x,y,z,r; }rr; fun a[105]; bool vis[105],vis2[105]; double len[105][105]; int cout,n; void fun(int i) { int j; queue<int>q; q.push(i); for(i=1; i<=n; i++) vis2[i]=false; while(!q.empty())//包含的 { i=q.front(); q.pop(); cout++; vis[i]=true; for(j=1; j<=n; j++) { if(len[i][j]<=0 && vis[j]==false && vis2[j]==false) { q.push(j); vis2[j]=true; } } } } int main() { int i,j; while(1) { cout=0; double sum=0; scanf("%d",&n); if(n==0) break; for(i=1; i<=n; i++) { scanf("%lf%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z,&a[i].r); vis[i]=false; } for(i=1; i<=n; i++) for(j=1; j<=n; j++) len[i][j]=len[j][i]=sqrt(pow(a[i].x-a[j].x,2)+pow(a[i].y-a[j].y,2)+pow(a[i].z-a[j].z,2))-a[i].r-a[j].r; fun(1);//将1放入的 double Max; int k; while(cout<n) { Max=10000000; for(i=1; i<=n; i++) { if(vis[i]==false) continue; for(j=2; j<=n; j++) { if(vis[j]==true) continue; if(len[i][j]<Max) { Max=len[i][j]; k=j; } } } if(Max>0) sum+=Max; fun(k); } printf("%0.3lf\n",sum); } return 0; }