第0篇--Dijkstra算法的实现
来源:互联网 发布:php获取字符串的位置 编辑:程序博客网 时间:2024/06/05 20:26
去年大一的时候就学过Dijkstra,但是当时候为了添加什么功能把代码改崩了,后来重装系统后就找不到代码在哪里放的了,今天刚好写报告要用,所以没看别人的博客自己重新写了一下。
目前输出是倒序输出的,不太直观,其他的都实现了,如果想改成手动输入初始化一些边点可以自己动手改一下Initialization函数,如果要输出任意两点间的最短距离,在循环外层再加一层函数,让后改掉相应参数即可。
算法暂时就不展开讲了,网上有很多,我先把重点放在代码实现上。
- 下面是代码:
#include<stdio.h>#include<stdlib.h>//初始化数组void Initialization(int point[][6]){ for (int i = 0; i < 6; ++i) { for (int j = 0; j < 6; ++j) { if (i == j) { point[i][j] = 0; } else { point[i][j] = -1; continue; } } } //有向图的初始化(示例) //point[0][2] = 10; //point[0][4] = 30; //point[0][5] = 100; //point[1][2] = 5; //point[2][3] = 50; //point[4][3] = 20; //point[3][5] = 10; //point[4][5] = 60; //无向图的初始化(示例) point[0][2] = point[2][0] = 10; point[0][4] = point[4][0] = 30; point[0][5] = point[5][0] = 100; point[1][2] = point[2][1] = 5; point[2][3] = point[3][2] = 50; point[3][4] = point[4][3] = 20; point[3][5] = point[5][3] = 10; point[4][5] = point[5][4] = 60;}//寻找从第0个点到各点的最短路径void Dijkstra(int point[][6]){ int road[6]; //用来存放点的访问顺序 int distance; //用来存放距离 int dis[6]; //用来存放第0个点到各点的最短距离 int flag[6]; //用来标记各点是否被访问过 for (int i = 0; i < 6; ++i) { dis[i] = INT_MAX; //初始化第零个点到各点的最短距离 flag[i] = 0; //初始化标记 road[i] = -1; } dis[0] = 0; //标记第0个点到自身的距离为0 distance = dis[0]; //distance=dis[0],用来存放第0个点到上次得出距离最小点的与第0个点间距离 flag[0] = 1; //标记第0个点为已访问的点 road[0] = 0; int minpoint = 0, temppoint = 0; //minpoint为每次循环后距离最小的点,temppoint用来临时存放最小的点 for (int i = 1; i < 6; ++i) { int mindistance = INT_MAX; distance = dis[minpoint]; for (int j = 1; j < 6; ++j) { if (!flag[j] && minpoint != j) //如果没访问过该点且不是自身到自身 { //如果minpoint到j点有路且当前点的权值加上两点间的距离比原先距离小则更新 if (point[minpoint][j] != -1 && point[minpoint][j] + distance < dis[j]) { dis[j] = point[minpoint][j] + distance; road[j] = minpoint; } } //在循环的同时更新并标记未访问过的点的最小距离和所对应的点 if (!flag[j] && dis[j] < mindistance) { mindistance = dis[j]; temppoint = j; } } minpoint = temppoint; //循环结束,标记距离最小点被访问过 flag[minpoint] = 1; for (int k = 0; k < 6; ++k) //为了便于理解,输出每次遍历后第0个点到其他点的距离 { if (dis[k] == INT_MAX) { printf("∞\t"); } else { printf("%d\t", dis[k]); } } printf("\n"); } for (int k = 0; k < 6; ++k) { int t = k; if (road[t] >=0) { printf("%d <- ", t); while (road[road[t]] != road[t]) { printf("%d <- ", road[t]); t = road[t]; } printf("%d\n", road[t]); } }}int main(){ int point[6][6]; //定义数组 Initialization(point); //初始化数组 Dijkstra(point); //求第0个点到各点的最小距离 return 0;}
- 输出:
阅读全文
0 0
- 第0篇--Dijkstra算法的实现
- Dijkstra算法的实现
- Dijkstra算法的实现
- dijkstra算法的实现。
- Dijkstra算法的实现
- Dijkstra算法的C++实现
- Dijkstra算法的堆实现
- 关于Dijkstra算法的实现
- 关于Dijkstra算法的实现
- Dijkstra算法的STL实现
- Dijkstra算法的C++实现
- c++实现的Dijkstra算法
- Dijkstra算法的Java实现
- Dijkstra算法的C++实现
- Dijkstra算法的C++实现
- Dijkstra算法的Java实现
- Dijkstra算法C++的实现
- Dijkstra算法的java实现
- Js复习
- 飞龙的程序员书单 – 思想、工程、架构、职业发展
- 【NOIP2011普及组】瑞士轮
- “自顶向下,逐步求精”
- 在LLVM中编写pass的详细教程(1)
- 第0篇--Dijkstra算法的实现
- 二叉树的前序中序后序按层遍历
- vim
- 社团学习成果,素数筛
- 虚拟机NAT模式的网络设置
- 翻译:Doc2vec指导
- 感恩节,杜蕾斯一口气调戏了13个品牌
- 安装完nginx输入ip跳转不了主页解决办法
- APP2.0测试经验