1、 /权值的无穷大表示typedef int adjmatrixMaxVertexNumMaxVertexNum; /邻接矩阵 typedef struct Node int adjvex; struct Node *next; edgenode; /路径结点【函数说明】 void InitMatrix(adjmatrix &G)功能:初始化邻接矩阵表示的有向带权图思路:将邻接矩阵中的所有权值设置为无穷大(MaxValue) void CreateMatrix(adjmatrix &G, int n)建立邻接矩阵表示的有向带权图(即通过输入图的每条边建立图的邻接矩阵)按照输入的顶点信息和权值信息
2、,更新邻接矩阵内对应的值 void PrintMatrix(adjmatrix G, int n)输出邻接矩阵表示的有向带权图 (即输出图的每条边)按照一定的格式输出邻接矩阵 void Dijkstra( adjmatrix GA, int dist, edgenode *path, int i, int n)求最短路径的DijKstra算法函数按照从源点到其余每一顶点的最短路径长度递增的次序依次求出从源点到每个顶点的最短路径及长度。设立一个集合S,用以保存已求得最短路径的终点,其初值为只有一个元素,即源点;一个数组 distn,其每个分量 distj 保存从源点经过S集合中顶点最后到达顶点
3、j 的路径中最短路径的长度,其初值为从源点到每个终点的弧的权值(没弧则置为);一个指针数组pathn,pathj指向一个单链表,保存相应于distj的从源点到顶点 j 的最短路径(即顶点序列),初值为空。 void PATH(edgenode *path, int i, int j)将pathi的路径改为pathj的路径+i分为三个步骤:一,删除pathi中原来保存的链表;二,将pathj的路径复制给pathi;三,将j结点加入pathi的路径中 void PrintPath(int dist, edgenode *path, int n)打印输出从源点到每个顶点的最短路径及长度的函数按照一定
4、的格式遍历输出从源点到每个顶点的最短路径及长度四. 实验结果与分析包括运行结果截图等 【测试数据】顶点数:7输入弧的信息:尾顶点头顶点权值183524106159正确的邻接矩阵应为:下面以测试数据为基准,给出DijKstra算法生成最短路径的状态变化图:(注:顶点旁边的代表当前状态下从源点到该顶点的最短路径长度)【状态】 【状态】 【状态】 【状态】 【状态】 【状态】 【状态(最短路径)】五. 心得体会记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。【附录-源程序】Test9_2.cpp#includestdlib.hiostream.hstring.h#includ
5、eGraph2.hvoid main() int n; adjmatrix G; edgenode *pathMaxVertexNum; int distMaxVertexNum; void Dijkstra( adjmatrix GA, int dist, edgenode *path, int i, int n); void PrintPath(int dist, edgenode *path, int n); InitMatrix(G); printf(输入要构造的图顶点数n); scanf(%d,&n); CreateMatrix(G,n); PrintMatrix(G,n); /打印
6、图的邻接矩阵 coutendl*以下为DijKstra算法部分*endl; Dijkstra(G, dist, path, 0, n); PrintPath(dist,path,n);/求最短路径的DijKstra算法函数void Dijkstra( adjmatrix GA, int dist, edgenode *path, int i, int n) int j,k; int v = 1,minIndex; void PATH(edgenode *path, int i, int j); bool *isStepped; /初始化部分 /isStepped:申请n个空间,除i以外均为fa
7、lse /dist:邻接矩阵中i顶点到各顶点的距离 /path:邻接矩阵中i顶点到各顶点若有路径,则保存;无路径置为NULL isStepped = new booln; for (j = 0; j adjvex = i;next = new edgenode;next-adjvex = j;next = NULL; else pathj = NULL; isSteppedj = false; isSteppedi = true; while(v = n) /尝试查找当前最小路径结点,用minIndex保存顶点 minIndex = i; for (k = 0; k k+) if (distk
8、 distminIndex & (!isSteppedk) minIndex = k; /有查找到最小路径顶点,则将其并入集合 if (minIndex != i) isSteppedminIndex = true; /未查找到,则说明路径都为,退出 else break; /通过while中确定的最小路径顶点(minIndex)到达当前顶点 /若路径长度小于dist中保存的路径长度,则修改 if (GAminIndexk + distminIndex next; delete pathi; pathi = p; /将pathj的路径复制给pathi p = new edgenode; p-a
9、djvex = pathj-adjvex; pathi = p; t = pathj- while (t ! q = p; p = new edgenode; p-adjvex = t- q-next = p; t = t- /将j结点加入pathi的路径中 q = p; q-/打印输出从源点到每个顶点的最短路径及长度的函数void PrintPath(int dist, edgenode *path, int n) int i; edgenode *p; for (i = 1; i i+) cout vi 最短路径:; p = pathi; if (p = NULL) coutadjvex最
10、短长度:disti Graph2.h/初始化邻接矩阵表示的有向带权图void InitMatrix(adjmatrix & int i,j; for (i=0; iMaxVertexNum; i+) /邻接矩阵初始化 for (j=0; j头顶点名,权值 输入数据,以0-0,0结尾:如A-B,23 n while(true) /构造邻接矩阵%d-%d,%dv,&w,&q); /输入弧的两个定点及该弧的权重 getchar(); if (v = 0 & w = 0 ) break; if( v = n | w = n) cerrvertex ERROR!exit(1); Gvw=q;/输出邻接矩阵表示的有向带权图 (即输出图的每条边)void PrintMatrix(adjmatrix G, int n)-Your Graph is:n; i+) j+) if(Gij!=MaxValue) printf( %2d | ,Gij); else printf( | n
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1