迪杰斯特拉最短路径

Posted yshun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迪杰斯特拉最短路径相关的知识,希望对你有一定的参考价值。

以4 a b 1 b c 6 a c 6 a d 2 d c 7 b e 6 c e 4 c f 5 d f 1 f e 6 e g 8 f g构造有向图并找出最短路径

#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 100
#define BIG 100
typedef char VertexType;//顶点节点的数据类型
typedef int EdgeType;//边权值的数据类型
typedef struct
    VertexType Vertex[MaxVertexNum];//顶点表
    EdgeType Edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,边表
    int vertexnum,arcnum;//顶点数和边数
MGraph;//邻接矩阵的存储结构
int Locate(VertexType v)
    if(v>=97)return (int)v-97;
    else return (int)v-65;
//将顶点转换为相应的位置
typedef struct
    int vertex[MaxVertexNum];
    int top;
Stack;
void CreatGraph(MGraph &M)
    EdgeType e;
    VertexType v1,v2;
    printf("输入节点数和边数:");
    scanf("%d %d",&M.vertexnum,&M.arcnum);
    printf("输入节点:");
    for(int i=0;i<M.vertexnum;i++)
        getchar();
        scanf("%c",&M.Vertex[i]);
    
    for(int i=0;i<M.vertexnum;i++)
        for(int j=0;j<M.vertexnum;j++)
            M.Edge[i][j]=BIG;
        
    
    fflush(stdin);//清除缓存,防止下一次的scanf()函数失效
    printf("输入路径的权值及其两个节点:\\n");
    for(int i=0;i<M.arcnum;i++)
        scanf("%d %c %c",&e,&v1,&v2);
        M.Edge[Locate(v1)][Locate(v2)]=e;
    
//构造一个有向图
void PrintGraph(MGraph &M)
    printf("邻接矩阵\\n");
    for(int i=0;i<M.vertexnum;i++)
        printf("     %c ",M.Vertex[i]);
        for(int j=0;j<M.vertexnum;j++)
            if(M.Edge[i][j]!=BIG)
                printf("%d  ",M.Edge[i][j]);
            
            elseprintf("");
        
        printf("\\n");
    
//打印邻接矩阵
void visited(int v)
    printf("%c ",v+a);
//访问当前节点的位置
void Dijkstra(MGraph &M,VertexType a,int path[],int dist[])
    int v=Locate(a);
    int set[MaxVertexNum];//标记节点是否已并入最短路径中
    int min,k;
    for(int i=0;i<M.vertexnum;i++)
        dist[i]=M.Edge[v][i];
        set[i]=0;
        if(M.Edge[v][i]!=BIG)
            path[i]=v;
        
        else path[i]=-1;
    
    set[v]=1;
    for(int i=0;i<M.vertexnum-1;i++)
        min=20;
        for(int j=0;j<M.vertexnum;j++)
            if(set[j]==0&&dist[j]<min)
                min=dist[j];
                k=j;
            
        
        set[k]=1;
        for(int j=0;j<M.vertexnum;j++)
            if(set[j]==0&&dist[k]+M.Edge[k][j]<dist[j])
                dist[j]=dist[k]+M.Edge[k][j];
                path[j]=k;
            
        
    
    for(int i=1;i<M.vertexnum;i++)
        printf("a到%c的最短路径为:%d\\n",i+a,dist[i]);
    

int main()
    MGraph M;
    CreatGraph(M);
    PrintGraph(M);
    int dist[MaxVertexNum];//记录已找到的最短路径
    int path[M.vertexnum];//记录到vi的前一个顶点
    Dijkstra(M,a,path,dist);

技术图片

以上是关于迪杰斯特拉最短路径的主要内容,如果未能解决你的问题,请参考以下文章

(王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想代码演示答题规范)

迪杰斯克拉算法是怎样的?

最短路径迪杰斯特拉模板

LeetCode 1337. 矩阵中战斗力最弱的 K 行/215. 数组中的第K个最大元素(topk快排堆排)/743. 网络延迟时间(最短路径迪杰斯特拉,弗洛伊德)

算法-迪杰斯特拉算法(dijkstra)-最短路径

迪杰斯特拉算法的算法思想