问题及代码:
/*
02.* Copyright (c)2016,烟台大学计算机与控制工程学院
03.* All rights reserved.
04.* 文件名称:zhou.cpp
05.* 作 者:吕方舟
06.* 完成日期:2016年11月27日
07.* 版 本 号:v1.0
08.* 问题描述:求不带权连通图G中从顶点u到顶点v的一条最短路径。
09.*/
10.#include <stdio.h>
11.#include <malloc.h>
12.#include "graph.h"
13.
14.typedef struct
15.{
16. int data; //顶点编号
17. int parent; //前一个顶点的位置
18.} QUERE; //非环形队列类型
19.
20.void ShortPath(ALGraph *G,int u,int v)
21.{
22. //输出从顶点u到顶点v的最短逆路径
23. ArcNode *p;
24. int w,i;
25. QUERE qu[MAXV]; //非环形队列
26. int front=-1,rear=-1; //队列的头、尾指针
27. int visited[MAXV];
28. for (i=0; i<G->n; i++) //访问标记置初值0
29. visited[i]=0;
30. rear++; //顶点u进队
31. qu[rear].data=u;
32. qu[rear].parent=-1;
33. visited[u]=1;
34. while (front!=rear) //队不空循环
35. {
36. front++; //出队顶点w
37. w=qu[front].data;
38. if (w==v) //找到v时输出路径之逆并退出
39. {
40. i=front; //通过队列输出逆路径
41. while (qu[i].parent!=-1)
42. {
43. printf("%2d ",qu[i].data);
44. i=qu[i].parent;
45. }
46. printf("%2d\n",qu[i].data);
47. break;
48. }
49. p=G->adjlist[w].firstarc; //找w的第一个邻接点
50. while (p!=NULL)
51. {
52. if (visited[p->adjvex]==0)
53. {
54. visited[p->adjvex]=1;
55. rear++; //将w的未访问过的邻接点进队
56. qu[rear].data=p->adjvex;
57. qu[rear].parent=front;
58. }
59. p=p->nextarc; //找w的下一个邻接点
60. }
61. }
62.}
63.
64.int main()
65.{
66. ALGraph *G;
67. int A[9][9]=
68. {
69. {0,1,1,0,0,0,0,0,0},
70. {0,0,0,1,1,0,0,0,0},
71. {0,0,0,0,1,1,0,0,0},
72. {0,0,0,0,0,0,1,0,0},
73. {0,0,0,0,0,1,1,0,0},
74. {0,0,0,0,0,0,0,1,0},
75. {0,0,0,0,0,0,0,1,1},
76. {0,0,0,0,0,0,0,0,1},
77. {0,0,0,0,0,0,0,0,0}
78. }; //请画出对应的有向图
79. ArrayToList(A[0], 9, G);
80. ShortPath(G,0,7);
81. return 0;
82.}
运行结果:
知识点总结:求不带权连通图中两顶点间的一条最短路径。
学习心得:由于要用队列记录访问的顺序,找出路径,所以采用非环形队列,这里用到的是广度优先的算法。