您的位置:首页 > 其它

hdu 1162 Eddy's picture(最小生成树,prim)

2016-06-04 09:26 429 查看
#include <stdio.h>
#include <string.h>
#include <math.h>

#define INF 99999999
#define NUM 101

typedef struct point point;
struct point
{
double x,y;
};
point p[NUM];
int n;
double map[NUM][NUM],dis[NUM];
int book[NUM];

double getDistance(point p1, point p2)
{
return sqrt(pow(p1.x-p2.x,2.0) + pow(p1.y-p2.y,2.0));
}

void creatMap()
{
int i,j;
for(i = 1; i <= n; ++i)
for(j = i; j <= n; ++j)
map[i][j] = map[j][i] = getDistance(p[i],p[j]);
}

double prim()
{
memset(book,0,sizeof(book));
int i,j,count = 0,pos;
double sum = 0.0,min;
for(i = 1; i <= n; ++i)
dis[i] = map[1][i];
book[1] = 1;
++count;
while(count < n)
{
min = INF;
for(i = 1; i <= n; ++i)
if(!book[i] && dis[i] < min)
{
min = dis[i];
pos = i;
}
book[pos] = 1;
++count;
sum += dis[pos];

for(i = 1; i <= n; ++i)
if(!book[i] && dis[i] > map[pos][i])
dis[i] = map[pos][i];
}
return sum;
}

int main()
{
int i;
while(scanf("%d",&n) != EOF)
{
for(i = 1; i <= n; ++i)
scanf("%lf %lf",&p[i].x,&p[i].y);
creatMap();
printf("%.2f\n",prim());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: