/*prim算法*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int n;
bool visit[111];
double low[111];
double distance[111][111];
void prim(int num)
{
int i, cnt = 0;
for(i = 0; i < n; i++)
{
if(visit[i])
cnt++;
}
if(cnt == n)
return;
double min = 99999999;
for(i = 0; i < n; i++)
{
if(!visit[i])
low[i] = low[i] > distance[num][i] ? distance[num][i] : low[i];
}
for(i = 0; i < n; i++)
{
if(!visit[i])
{
if(min > low[i])
{
min = low[i];
num = i;
}
}
}
visit[num] = 1;
prim(num);
return;
}
int main(void)
{
int i, j, cas = 0;
double min;
double xy[111][2];
while(scanf("%d", &n), n)
{
min = 0;
memset(visit, 0, sizeof visit);
memset(low, 0, sizeof low);
memset(distance, 0, sizeof distance);
for(i = 0; i < n; i++)
scanf("%lf%lf", &xy[i][0], &xy[i][1]);
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
distance[i][j] = sqrt((xy[i][0] - xy[j][0]) * (xy[i][0] - xy[j][0]) + (xy[i][1] - xy[j][1]) * (xy[i][1] - xy[j][1]));
}
visit[0] = 1;
for(i = 0; i < n; i++)
low[i] = distance[0][i];
prim(0);
for(i = 0; i < n; i++)
min += low[i];
if(cas)
printf("\n");
printf("Case #%d:\nThe minimal distance is: %.2lf\n", ++cas, min);
}
}
01-19
590
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-18
06-05
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交