代码(这是用普利姆算法写和结构体的):
#include <stdio.h>#include <string.h>#include <math.h>double mx=999999.99;double dis[101];int biao[101],k;double sum;int n=100; typedef struct ma{ int x,y;}ma;ma p[101];double map[101][101];double getdis(ma p,ma q){ return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y));}void prim (int n){ k=1; sum=0.0; memset(biao,0,sizeof(biao)); int i,j; int pos; for(i=1; i<=n; i++) dis[i]=map[1][i]; biao[1]=1; for(i=1; i<=n-1; i++) { double min=mx; for(j=1; j<=n; j++) if(dis[j]<min&&!biao[j]) { min=dis[j]; pos=j; } if(min>=mx) {k=0; return;} sum=sum+min; biao[pos]=1; for(j=1; j<=n; j++) if(!biao[j]&&map[pos][j]<dis[j]) dis[j]=map[pos][j];
}return;}int main(){ int t,m,i,j; double d; scanf("%d",&t);while(t--){ scanf("%d",&m);for( i=1;i<=m;i++)scanf("%d %d",&p[i].x,&p[i].y);for(i=1;i<=m;i++) for(j=1;j<=m;j++) map[i][j]=map[j][i]=mx;for( i=1;i<m;i++) for(j=i+1;j<=m;j++) {d=getdis(p[i],p[j]); if(d>=10&&d<=1000) map[i][j]=map[j][i]=d*100.00; }prim(m); if(k==0) printf("oh!\n"); else printf("%.1lf\n",sum);} return 0;}