迪杰斯特拉(Dijkstra)算法求最短路径

我用的是邻接矩阵来存储图的。

代码如下:

void Graph:: Dijkstra(){
    struct DijNode{
        int index;
        int distance;
        vector<string> path;
        bool Founded;   //判定是否找到了...
    };
    DijNode*shorestPaths=new DijNode[mgraph.vexnum];
    string startPoint;
    int startIndex;
    cout<<"请输入单源点:"<<endl;
    cin>>startPoint;
    locate(startPoint,startIndex);
    //初始化数组
    shorestPaths[0]={startIndex,0,vector<string>{startPoint},true};
    for(int i=1;i<mgraph.vexnum;i++){
        shorestPaths[i]=DijNode{i,NONE,vector<string>{""},false};
    }
    //开始运行
    for(int i=1;i<mgraph.vexnum;i++){
        cout<<startIndex<<endl;
        //若这个点尚未确定最短路径并且从当前点出发存在路径且短于当前,那么很好,可以考虑
        for(int i=0;i<mgraph.vexnum;i++){
            if(i!=startIndex&&mgraph.arcs[startIndex][i].adj+shorestPaths[startIndex].distance<shorestPaths[i].distance&&shorestPaths[i].Founded==false){
                shorestPaths[i].path=shorestPaths[startIndex].path;
                shorestPaths[i].path.push_back(mgraph.vexs[i]);
                shorestPaths[i].distance=shorestPaths[startIndex].distance+mgraph.arcs[startIndex][i].adj;
            }
        }
        //挑选当前出距离最短的且未找到最短的路径的定点作为startPoint
        int MIN=-1;
        for(int i=0;i<mgraph.vexnum;i++){        //选出符合要求的第一个MIN值
            if(shorestPaths[i].Founded==false){
                MIN=i;
                break;
            }
        }
        for(int i=0;i<mgraph.vexnum;i++){
            if(shorestPaths[i].Founded==false&&shorestPaths[i].distance<shorestPaths[MIN].distance){
                MIN=i;
            }
        }
        shorestPaths[MIN].Founded=true;
        startIndex=MIN;
    }
    //结果输出
    for(int i=1;i<mgraph.vexnum;i++){
        cout<<"从单源点"<<mgraph.vexs[shorestPaths[0].index]<<"到"<<mgraph.vexs[shorestPaths[i].index]<<"的最短路径为:";
        for(int j=0;j<shorestPaths[i].path.size()-1;j++){
            cout<<shorestPaths[i].path[j]<<"->";
        }
        cout<<shorestPaths[i].path[shorestPaths[i].path.size()-1]<<"路径长度:"<<shorestPaths[i].distance<<endl;
    }
}

时间: 2024-10-14 07:10:04

迪杰斯特拉(Dijkstra)算法求最短路径的相关文章

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法

43. 蛤蟆的数据结构笔记之四十三最短路径之迪杰斯特拉(Dijkstra )算法 本篇名言:"辛勤的蜜蜂永没有时间悲哀.--布莱克" 这次来看下Dijkstra )算法.还是老方法,先原理,后实现.代码来自网络. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47046031 1.  最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 管道铺设.线路安排

C# 迪杰斯特拉(Dijkstra)算法

Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合.一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知. 初始时,S中仅含有源.设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度.Dijkstra算法每次从V-S中取出具有最短特殊路长度

迪杰斯特拉(Dijkstra)算法

1 # include <stdio.h> 2 3 # define MAX_VERTEXES 20//最大顶点数 4 # define INFINITY 65535;//代表∞ 5 6 typedef struct 7 {/* 无向图结构体 */ 8 int vexs[MAX_VERTEXES];//顶点下标 9 int arc[MAX_VERTEXES][MAX_VERTEXES];//矩阵 10 int numVertexes, numEdges;//顶点数和边数 11 12 }MGra

[C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)

1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 [适用范围]Dijkstra算法仅适用于[权重为正]的图模型中 时间复杂度 O(n^3) 补充说明 亦可应用于[多源最短路径](推荐:Floyd算法(动态规划,O(n^3))) Dijkstra 时间复杂度:O(n^3) 1.2 算法描述 1.2.1 求解过程(具体思路) 1.2.2 示例 1.2

迪杰斯特拉/dijkstra 算法模板(详细注释)

#include <iostream> #include <malloc.h> #include <cstring> #include <stack> #include <cstdio> //定义邻接矩阵的大小 #define N 100 #define M 100 using namespace std; typedef struct node { int map[N][M];//邻接矩阵 int n;//顶点数 int e;//边数 }MGr

迪杰斯特拉/dijkstra 算法模板(具体凝视)

#include <iostream> #include <malloc.h> #include <cstring> #include <stack> #include <cstdio> //定义邻接矩阵的大小 #define N 100 #define M 100 using namespace std; typedef struct node { int map[N][M];//邻接矩阵 int n;//顶点数 int e;//边数 }MGr

Dijkstra算法求最短路径(java)(转)

原文链接:Dijkstra算法求最短路径(java) 任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式用OPEN,CLOSE表的方式,其采用的是贪心法的算法策略,大概过程如下:1.声明两个集合,open和close

Dijkstra算法求最短路径

摘自最短路径算法,如有任何侵权问题,请及时通知本人,本人将马上予以删除. 链接算法过程 /* 有向图的构建及最短路径求解(Dijkstra) */ #include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 30 #define MAX_INT 1000 typedef int VrType; typedef char VtType; bool visted[MAX_VERTEX_NUM]; //搜索时的标记矩阵 ty

数据结构之---C语言实现最短路径之Dijkstra(迪杰斯特拉)算法

此处共有两段代码: 一. 这段代码比较全面,其中参考了github上的相关源码.可以说功能强大. //Dijkstra(迪杰斯特拉算法) #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 100 // 矩阵最大容量 #define INF 65535 // 最大值65535 #define isLetter(a) ((((a)>='a')&&((a)<