与1875类似,所以这里不再用kruskal而是用了prim。
1Y
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162、
就是最普通的prim,只是权值变成了double型
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define M 109
#define INF 0x3f3f3f3f
double map[M][M];
double dis[M];
bool vis[M];
double ans;
struct
{
double x,y;
}point[M];
int n;
void prim()
{
for(int i = 1;i <= n;i++)
dis[i] = map[1][i];
vis[1] = true;
for(int i = 2;i <= n;i++)
{
double min = INF;
int k;
for(int j = 1;j <= n;j++)
{
if(!vis[j] && dis[j]<min)
{
min = dis[j];
k = j;
}
}
ans += min;
vis[k] = true;
for(int j = 1;j <= n;j++)
{
if(!vis[j] && dis[j]>map[k][j])
{
dis[j] = map[k][j];
}
}
}
}
int main()
{
while(scanf("%d",&n)==1)
{
ans = 0;
memset(vis,0,sizeof(vis)); //本题对于map来说并不需要进行初始化,因为每一个点之间都会读入一条路,
for(int i = 1;i <= n;i++)
{
scanf("%lf %lf",&point[i].x,&point[i].y);
}
for(int i = 1;i <= n;i++)
for(int j = i+1;j <= n;j++)
{
double temp = sqrt(fabs(point[i].x-point[j].x)*fabs(point[i].x-point[j].x)+fabs(point[i].y-point[j].y)*fabs(point[i].y-point[j].y));
map[i][j] = temp;
map[j][i] = temp;
}
prim();
printf("%.2f\n",ans);
}
return 0;
}