最小生成树,用Prim算法。
#include <iostream>
#include<stdio.h>
#include<cstring>
#include<queue>
#include<math.h>
using namespace std;
const double INF=100000000.0;
int visit[110];
double d[110],w[110][110];
struct
{
int x,y;
} re[110];
int main()
{
int n,cas,r,i,j,ok=0;
double min; //之前写成int了,wa了我一晚上,想哭啊~~~~
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
//if(m==0) break;
double ans=0.0;
memset(visit,0,sizeof(visit));
for(i=1; i<=n; i++)
{
d[i]=(i==1?0:INF);
for(j=1; j<=n; j++)
{
if(i==j)w[i][j]=0;
else w[i][j]=INF;
}
}
for(i=1; i<=n; i++)
{
scanf("%d %d",&re[i].x,&re[i].y);
}
if(n==1) ok=1;
for(i=1; i<=n; i++)
for(j=i+1; j<=n; j++)
{
// printf("aaa%lf\n",(re[i].x-re[j].x)*(re[i].x-re[j].x));
double xx=re[i].x-re[j].x;
double yy=re[i].y-re[j].y;
double dis=sqrt(xx*xx+yy*yy);
if(dis<10.000000||dis>1000.000000)
w[i][j]=w[j][i]=INF;
else w[i][j]=w[j][i]=dis;
}
queue<int>q;
q.push(1);
int count=1;
visit[1]=1;
while(count<n)
{
// printf("count %d\n",count);
min=INF;
ok=0;
int temp=q.front();
q.pop();
for(i=1; i<=n; i++)
{
if(visit[i]==0)
{
if(d[i]>w[temp][i])
d[i]=w[temp][i];
if(d[i]<min)
{
ok=1;
min=d[i];
r=i;
}
}
}
if(ok==1) //说明有一条路小于INF
{
visit[r]=1;
q.push(r);
count++;
ans+=d[r];
}
else break;
}
if(ok==1)printf("%.1lf\n",ans*100);
else printf("oh!\n");
}
return 0;
}