Dijkstra算法
来源:互联网 发布:jq数组是否包含某值 编辑:程序博客网 时间:2024/06/05 15:54
Dijkstra算法扫盲:
维基百科
百度百科
CNblog
CSDN博客
当然还有许多别的参考,这里只列举几个我当时看过的~
正题:
最近在学数据结构,图 这一部分是个大难题。Dijkstra是非常典型的单源最短路径算法,详细总结如下。
如有不妥,请留言指出,共同学习进步,非常感谢啦~
程序均可直接运行
#include <iostream>using namespace std;#include "stack.h" #define MAXDIS 99999 //预定义最大距离(无穷远)#define MAXNUM 10 //预定义最大顶点个数int preVertex[MAXNUM];int markVertex[MAXNUM];// num -- 有num个结点 // source -- 源结点 // distance[i] -- 第i个点到源结点的距离// preVertex[i] -- 第i个点的前一个结点 // graphArray[][] -- 每两个结点之间的距离 void myDijkstra(int num, int source, int *distance, int graphArray[MAXNUM][MAXNUM]){ if(num<=0 || source<0 ||distance==NULL || graphArray==NULL) return; for(int i =1; i<=num; i++)//初始化distance[],s[],preVertex[] { distance[i] = graphArray[source][i]; markVertex[i] = 0; if(distance[i] < MAXDIS) preVertex[i] = source; else preVertex[i] = 0; } distance[source] = 0; markVertex[source] = 1; // 依次将未放入markVertex[]中,取distance[]中最小值的结点,放入markVertex[]中// 一旦markVertex[]包含了所有顶点,distance[]就记录了从源点到所有其他顶点之间的最短路径长度 // 注意是从第二个节点开始,第一个为源点 for(int i =1; i<=num; i++) { int tempVertex = source; int tempDistance = MAXDIS; for(int j=1; j<=num; j++)//循环结束后可以找到空闲结点中到当前结点距离最小的结点 { if(!markVertex[j] && tempDistance > distance[j]) { tempVertex = j; tempDistance = distance[j]; } } markVertex[tempVertex] = 1;//将该结点标记 //然后更新所有结点到源结点的距离 for(int j=1; j<=num; j++) { if(!markVertex[j] && graphArray[tempVertex][j]<MAXDIS) { int newDistance = distance[tempVertex]+graphArray[tempVertex][j]; if(distance[j] > newDistance) { distance[j] = newDistance; preVertex[j] = tempVertex; } } } }} void printPath(int *preVertexr, int source, int destination){ stack<int> stackTemp; for(int i=destination,j=0; i>=1; i=preVertexr[i]) stackTemp.push(i); while(!stackTemp.empty()) { cout<<stackTemp.top()<<"\t"; stackTemp.pop(); } cout<<endl;} //测试用的主函数是参考 CSDN博客 的int main(){// 各数组都从下标1开始int n, line;cin >> n;// 输入结点数cin >> line;// 输入路径数int p, q, len;// 输入p, q两点及其路径长度 int c[MAXNUM][MAXNUM];// 初始化c[][]为MAXINTfor(int i=1; i<=n; ++i)for(int j=1; j<=n; ++j)c[i][j] = MAXDIS; for(int i=1; i<=line; ++i) {cin >> p >> q >> len;if(len < c[p][q]) // 有重边的话{c[p][q] = len; // p指向qc[q][p] = len; // q指向p,这样表示无向图}} int dist[MAXNUM];for(int i=1; i<=n; ++i)dist[i] = MAXDIS;for(int i=1; i<=n; ++i){for(int j=1; j<=n; ++j)printf("%8d", c[i][j]);printf("\n");} myDijkstra(n, 1, dist, c);for(int i=1; i<=n; i++){ cout<<dist[i]<<"\t"; } cout<<endl;// 最短路径长度cout << "源点到最后一个顶点的最短路径长度: " << dist[n] << endl; // 路径cout << "源点到最后一个顶点的路径为: ";printPath(preVertex, 1, n);system("pause");return 0;}/*571 2 101 4 301 5 1002 3 503 5 104 3 204 5 60*/
0 0
- Dijkstra算法
- dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra 算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra 算法
- Dijkstra 算法
- dijkstra算法
- Dijkstra 算法
- Dijkstra算法
- Dijkstra算法
- Dijkstra算法
- dijkstra算法
- 【水模拟】#62 A. Irrational problem
- S3C2440启动代码2440init.s彻底解析
- android 自定义控件--(圆盘形菜单控件)
- CF 248 C. Ryouko's Memory Note
- abstract 抽象类
- Dijkstra算法
- RMI学习笔记
- 【cocos2d-x-3.1.1系列2】cocos2d-x3.1.1移植安卓过程
- Linear regression with multiple variables(多特征值的线性回归)
- 1006
- 继承
- 试题1
- 【水String】#61 A. Petya and Java
- hbase预览