#include "stdio.h".
#include <iostream>
#include<math.h>
using namespace std;
double dis[105][105];
double p[105][2];//点的坐标
double ans;//最短距离
int n;
void makedis()//算出两个点之间的距离
{
int i, j; double r;
for (i = 0; i < n; i++)
for (j = i; j <n; j++)
{
r = sqrt((p[i][0] - p[j][0])*(p[i][0] - p[j][0]) + (p[i][1] - p[j][1])*((p[i][1] - p[j][1])));
dis[i][j] = r;// i 点到j 点 的距离
dis[j][i] = r;
}
} void prim()
{
int temp[105]; //存放已经加入的结点
int size; // 已加入的结点个数
int i, j, k;
int curnode, pos2;
double min; temp[0] = 0;
size = 1; dis[0][0] = 1; for (i = 0; i < n - 1; i++)//执行n-1次将所有的点访问完
{
min = 32767; // 极大值
for (j = 0; j < size; j++)
{
curnode = temp[j];
for (k =0; k < n; k++)
if (dis[curnode][k] <= min && dis[k][k] == 0) //min 为当前最小值,为0表示没有访问过,如果新加入结点后有再小的边就将对应的点加入
{
min = dis[curnode][k];
pos2 = k;
}
}
ans += min;
dis[pos2][pos2] = 1;
temp[size] = pos2; size++; }
} int main()//主程序
{
int step;
int i;
step = 0;
while (scanf("%d", &n))//输入点的个数,为0时结束
{
step++;
ans = 0;//距离总和
if (n == 0) break;
if (step != 1)printf("\n");
for (i = 0; i <n; i++)//输入n 个点的坐标
{
scanf("%lf%lf", &p[i][0], &p[i][1]);
}
makedis();
prim();
printf("Case #%d:\n", step);
printf("The minimal distance is: %.2lf\n", ans);
}
return 0;
}

题目

最新文章

  1. imx6 uboot saveenv fail
  2. Typescript 中类的继承
  3. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q1-Q3)
  4. 【C语言】4-指针
  5. STL简介
  6. 【python自动化第十一篇】
  7. MD格式示例
  8. rpm 命令详解
  9. 18 UI美化transition 图片过渡
  10. PM过程能力成熟度2级
  11. 转载 -- jquery easyui datagrid 动态表头 + 嵌套对象属性展示
  12. 设计模式C++学习笔记之十四(Iterator迭代器模式)
  13. MySQL5.7版本及以上,改密码sql语句;grant创建用户已经密码
  14. pthon入门之strip()和split()函数简单区分
  15. web测试工具列表
  16. 四则运算 SPEC 20160911
  17. Mongodb 安装 和 启动
  18. centos7 安装SSH
  19. 【前端学习笔记】JavaScript JSON对象相关操作
  20. Git使用sublime_text作用默认编辑器

热门文章

  1. 个人对AutoResetEvent和ManualResetEvent的理解(转载)
  2. 0-systemctl开机启动项
  3. Javascript图片无缝滚动
  4. 高DPI设置时禁用显示的方法
  5. 认真分析mmap:是什么 为什么 怎么用【转】
  6. (转) CCTextFieldTTF输入框
  7. 提高mysql插入性能
  8. 第四章:管道与FIFO
  9. 用一个案列详细讲解UITextFiled
  10. [问题2014S02] 复旦高等代数II(13级)每周一题(第二教学周)