迪杰斯特拉最短路径
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. 网络延迟时间(最短路径迪杰斯特拉,弗洛伊德)