最小生成树 的裸题 , Prim算法
第一次没有把函数的类型改成double,所以出不来3.41而是3.00 。这个错误找的我好蛋疼=。=
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
const int max = 0x7ffffff;
double map[105][105];
int v[105];
struct A
{
double x,y;
}e[105];
double low[105];
double MinTree(int n)
{
int i,j,flag;
double min,sum = 0.0;
memset(v,0,sizeof(v));
v[0] = 1;
for(i=1; i<n; i++)
{
low[i] = map[0][i];
}
for(i=1; i<n; i++)
{
min = max;
flag = -1;
for(j=0; j<n; j++)
{
if(!v[j] && low[j]<min)
{
min = low[j];
flag = j;
}
}
sum+=min;
v[flag] = 1;
for(j=0; j<n; j++)
{
if(!v[j] && map[flag][j]<low[j])
{
low[j] = map[flag][j];
}
}
}
return sum;
}
int main()
{
int n,i,j;
double ans;
while(~scanf("%d",&n))
{
ans = 0;
memset(e,0,sizeof(e));
for(i=0; i<n; i++)
{
scanf("%lf %lf", &e[i].x, &e[i].y );
}
memset(map,0,sizeof(map));
for(i=0; i<n; i++)
{
for(j=i+1; j<n; j++)
{
map[i][j] = (double)sqrt( pow(e[i].x-e[j].x, 2.0) + pow(e[i].y-e[j].y, 2.0) );
map[j][i] = map[i][j];
}
//printf("%lf\n",map[i][j]);
}
ans = MinTree(n);
printf("%.2lf\n", ans);
}
return 0;
}