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