一个求两点之间最短距的帖子
2017-07-27 16:25
15 查看
第一个接触到的东西是迪杰斯特拉算法。
网上的教程都有各种指针,但是我对指针一点都不了解啦
下面这个代码是一个没有指针的最简单的过程。
我要加很多注释了防止下次自己又要重新学一遍
上面写的时候太愚蠢了,改一下就可以成为从任意起点开始的程序
未完,还有几种方法没来得及看呢等看完补全啊哈
以下,完全相同的代码,是没有注释的方便复制版本嘿嘿我就是这么懒啦
网上的教程都有各种指针,但是我对指针一点都不了解啦
下面这个代码是一个没有指针的最简单的过程。
我要加很多注释了防止下次自己又要重新学一遍
//一个可以求出从起点到任一点距离的程序 #include"iostream" #include"string.h" //还记得这个吗memset的头文件记得加.h using namespace std; int map[1000][1000]; //记录每两点之间的距离信息 int pos; //标记运行到哪个位置 int visited[1000]; //判断是否访问过(每次循环只改变一个点而不是一条路径) int low[1000];//the lowest length; //每点距离起始点的距离 void work(int n) { int Max = 9999999; memset(visited, 0, sizeof(visited)); //memset赋值的时候有要求的不可以什么值都赋 for (int i = 0; i < 1000; i++) low[i] = Max; //先将每个点与起始点的距离设置为最大值(方便更新时比较) map[1][1] = 0; //修改起始点的信息 visited[1] = 1; for (int i = 1; i <= n; i++) { low[i] = map[1][i]; //先将与起始点相邻的点与存入各点与起始点距离的数组 } for (int p = 1; p <= n; p++) { pos = 1; //将pos指向起始点 int min = Max; //先将最短距离设置为最大值(方便比较) for (int i = 1; i <= n; i++) { if (min > low[i] && visited[i] == 0) { min = low[i]; //寻找第一层与起始点相邻点中距离最短的那个并标记 pos = i; } } visited[pos] = 1; //将此点设置为已访问的点 for (int i = 1; i <= n; i++) { if (visited[i] == 0 && map[pos][i] + low[pos] < low[i]) { low[i] = map[pos][i] + low[pos]; //这步一定要理解啊喂!可以理解为把第一层中最近的那个点 //相邻的最近点直接连在low中连到了起始点,打通任督二脉 //的骚操作 //所以上面在比较的时候也要记得直接比较low而不是map!!在这里错了很久找不到原因!! } } } int main() { int Max = 9999999; //cout << Max; //memset(map, , sizeof(map)); for (int i = 0; i < 1000; i++) for (int j = 0; j < 1000; j++) map[i][j] = Max; // int n, m;//n is point m is the number of the road cin >> n >> m; for (int i = 1; i <= m; i++) { int x, y; cin >> x >> y; int length; cin >> length; map[x][y] = map[y][x] = length; } //cin the message work(n); //如果想设置任一点为起点可以将函数多传入一个值 int a; while (cin >> a) cout << low[a]; return 0; }
上面写的时候太愚蠢了,改一下就可以成为从任意起点开始的程序
未完,还有几种方法没来得及看呢等看完补全啊哈
以下,完全相同的代码,是没有注释的方便复制版本嘿嘿我就是这么懒啦
//迪杰斯特拉算法 #include"iostream" #include"string.h" using namespace std; int map[1000][1000]; int pos; int visited[1000]; int low[1000];//the lowest length; void work(int n) { int Max = 9999999; memset(visited, 0, sizeof(visited)); for (int i = 0; i < 1000; i++) low[i] = Max; map[1][1] = 0; visited[1] = 1; for (int i = 1; i <= n; i++) { low[i] = map[1][i]; } for (int p = 1; p <= n; p++) { pos = 1; int min = Max; for (int i = 1; i <= n; i++) { if (min > low[i] && visited[i] == 0) { min = low[i]; pos = i; } } visited[pos] = 1; for (int i = 1; i <= n; i++) { if (visited[i] == 0 && map[pos][i] + low[pos] < low[i]) { low[i] = map[pos][i] + low[pos]; } } } } int main() { int Max = 9999999; //cout << Max; //memset(map, , sizeof(map)); for (int i = 0; i < 1000; i++) for (int j = 0; j < 1000; j++) map[i][j] = Max; // int n, m;//n is point m is the number of the road cin >> n >> m; for (int i = 1; i <= m; i++) { int x, y; cin >> x >> y; int length; cin >> length; map[x][y] = map[y][x] = length; } //cin the message work(n); int a; while (cin >> a) cout << low[a]; return 0; }
相关文章推荐
- (hdu 7.1.8)Quoit Design(最低点——在n一个点,发现两点之间的最小距离)
- 近日在javaeye看到一个讨论“两个系统之间传数”的帖子,感觉很有用,留下来以后用~
- 最短路径问题平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。
- 判别一个无向图中某两点之间是否存在一条长度为k的简单路径
- 给定一个平面内三个不同的点p1、p2和p3,求出任意两点(即点p1和点p2、点p1和点p3、点p2和点p3)之间的距离。
- 引用一个论坛的帖子学习 group ib order max组合查询
- 梁勇 java教材 编程练习题 第二章 2.6 键盘 读取一个在0 到 9999 之间的整数,并将该整数的各位数字相加。
- 在Eclipse中测试MySQL-JDBC(5)查询1-4之间的所有员工,并且封装为一个个的employee对象,并且存储到一个集合中
- 一个帖子学会Android开发四大组件
- 一个令人深思的帖子!
- 如何通过经纬度粗略计算地球两点之间的距离?直接上代码
- java中关于父子类之间this关键字的一个问题
- Android——高德地图设置中心点和缩放比例,获取两点之间距离
- 第十周任务一:求两点之间的直线长度
- 某公司2017秋季招聘在线编程题(求圆上n个点任意两点之间最大距离)
- 一个对WDB的帖子进行操作的类
- ORACLE同一个数据库下不同表结构之间的数据导入
- 16. 求两点之间的最短路径
- <mvc:annotation-driven/>与<mvc:default-servlet-handler/>之间的一个问题
- 用random()随机数做的一个0-100之间的猜数字