题意:先算出没两点之间的长度,然后直接套用Prim模版就行。
连接:http://acm.hdu.edu.cn/showproblem.php?pid=1162


#include <iostream> #include <cmath> using namespace std; #define INF 0x3fffffff #define MAX 100+10 double map[MAX][MAX]; int used[MAX]; double dis[MAX]; double sum; int n; struct node { double i; double j; }; void Prim(int start) { memset(used,0,sizeof(used)); for(int i=1;i<=n;i++) { dis[i]=INF; } dis[start]=0; for(i=1;i<=n;i++) { double Min=INF; int index; for(int j=1;j<=n;j++) { if(!used[j]&&Min>dis[j])//找最小值 { Min=dis[j]; index=j; } } sum+=dis[index]; used[index]=1; for(j=1;j<=n;j++) { if(dis[j]>map[index][j]&&map[index][j])//松弛 { dis[j]=map[index][j]; } } } return; } int main() { while(~scanf("%d",&n)) { node step[MAX]; sum=0; memset(map,0,sizeof(map)); for(int i=1;i<=n;i++) { scanf("%lf%lf",&step[i].i,&step[i].j);//坐标 } for(i=1;i<=n;i++) { for(int j=1;j<=n;j++) { map[i][j]=map[j][i]=sqrt((step[i].i-step[j].i)*(step[i].i-step[j].i)+(step[i].j-step[j].j)*(step[i].j-step[j].j));//找两点之间的权值 } } Prim(1); printf("%.2lf\n",sum); } return 0; }