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
原创粉丝点击