/*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
639

04-13
862

08-07
467
