最短路径算法————迪杰斯特拉算法
来源:互联网 发布:如何追妹子知乎 编辑:程序博客网 时间:2024/06/04 00:46
该算法解决的是图中从单个源点到其他顶点的最短路径问题:
如图,寻找点1到其他顶点的最短路径。
算法思路:
1、先找到距离源点1最近的顶点k(这个距离不一定是直线距离),可推理此时 k点已经找到最短路径。将k并入集合S。
2、当有k并入S后,源点1到各个顶点的最短距离可能发生变化,此时需要更新这些最短距离信息。
3、重复1、2步每次并入一个顶点。
所需的集合:
1、 需要图G,用邻接矩阵表示。
2、需要最短路径表D[n];
3、需要集合final[n],用以表示点是否在集合S内。
代码实现:
#include<iostream>using namespace std;#define INFINITY 2147483647//无向图的表示class Graph{public:int vexnum;int** Arcs;};//集合final和集合Dbool final[10010];int D[10010];//初始化工作void Init(Graph &MyGraph,int n){//为图动态分配内存MyGraph.Arcs = new int*[n+1];for (int i = 0; i <= n; i++){MyGraph.Arcs[i] = new int[n + 1];}//将所有的边都初始化为无穷大,并将所有点都排除到集合S外for (int i = 0; i <= n; i++){for (int j = 0; j <= n; j++){MyGraph.Arcs[i][j] = INFINITY;}final[i] = false;}}int main(){int n, m;cin >> n >> m;Graph MyGraph;Init(MyGraph, n);MyGraph.vexnum = n;//录入边的信息int a , b;for (int i = 0; i < m; i++){cin >> a >> b;cin >> MyGraph.Arcs[a][b];MyGraph.Arcs[b][a] = MyGraph.Arcs[a][b];}//用图G初始化D表,并将源点并入SD[1] = 0;final[1] = true;for (int i = 2; i <= n; i++){D[i] = MyGraph.Arcs[1][i];}//每次找到距离源点最近的点并入S,一共有vexnum-1个点需要并for (int i = 0; i < MyGraph.vexnum-1; i++){//找到S集合外距离源点最近的点,并入Sint min = INFINITY;int v;for (int j = 1; j <= MyGraph.vexnum; j++){if (!final[j]){if (D[j] < min){v = j;min = D[j];}}}final[v] = true;//更新D表的信息,如果 D[v] + MyGraph.Arcs[v][j] < D[j]//(其中v为新并入的顶点,j为S集合外的点),则更新D[j]for (int j = 1; j <= MyGraph.vexnum; j++){if (!final[j]){if (D[v] + MyGraph.Arcs[v][j] < D[j]){D[j] = D[v] + MyGraph.Arcs[v][j];}}}}//int sum = 0;for (int i = 1; i <= MyGraph.vexnum; i++){sum += D[i];}cout << sum;system("pause");}
阅读全文
0 0
- 最短路径——迪杰斯特拉算法
- 最短路径——迪杰斯特拉算法
- 最短路径—迪杰斯特拉算法
- 最短路径算法—Dijkstra(迪杰斯特拉)
- 最短路径算法—Dijkstra(迪杰斯特拉)
- 最短路径算法————迪杰斯特拉算法
- 最短路径算法—Dijkstra(迪杰斯特拉)算法
- 最短路径算法(1)—Dijkstra(迪杰斯特拉)算法
- 最短路径——Bellman_Ford算法
- 最短路径——SPFA算法
- 最短路径算法——Dijkstra
- 最短路径算法——Floyd
- SPFA算法——最短路径
- 最短路径——Floyd算法
- Floyd算法——最短路径
- 最短路径——Dijkstra算法
- SPFA算法——最短路径
- 最短路径——Dijkstra算法
- 使用spring aop 解决问题
- 《C++ Primer》第五版课后习题解答_第六章(2)(08-15)
- 计算机网络面试知识
- 为不同类型的网站选择最佳的SSL证书(上)
- HDU 1016 Prime Ring Problem(素数环)(DFS入门水题)
- 最短路径算法————迪杰斯特拉算法
- 【区块链】go ethereum 安装与使用
- [Android]关于用户并发访问下载初步探讨
- 使用json-lib进行Java和JSON之间的转换
- kali,ubuntu, debain DNS 配置
- easyui combobox 加载数据默认选中
- python基础——并发编程
- 【机房收费】What is WinSock?
- Ajax+Servlet:ajax请求servlet后无法在servlet中进行请求转发和重定向问题的原因