问题及代码:
/*
02.* Copyright (c)2016,烟台大学计算机与控制工程学院
03.* All rights reserved.
04.* 文件名称:zhou.cpp
05.* 作 者:吕方舟
06.* 完成日期:2016年11月27日
07.* 版 本 号:v1.0
08.* 问题描述:求不带权连通图G中,距离顶点v最远的顶点k
09.*/
10.#include <stdio.h>
11.#include <malloc.h>
12.#include "graph.h"
13.
14.int Maxdist(ALGraph *G,int v)
15.{
16. ArcNode *p;
17. int i,j,k;
18. int Qu[MAXV]; //环形队列
19. int visited[MAXV]; //访问标记数组
20. int front=0,rear=0; //队列的头、尾指针
21. for (i=0; i<G->n; i++) //初始化访问标志数组
22. visited[i]=0;
23. rear++;
24. Qu[rear]=v; //顶点v进队
25. visited[v]=1; //标记v已访问
26. while (rear!=front)
27. {
28. front=(front+1)%MAXV;
29. k=Qu[front]; //顶点k出队
30. p=G->adjlist[k].firstarc; //找第一个邻接点
31. while (p!=NULL) //所有未访问过的相邻点进队
32. {
33. j=p->adjvex; //邻接点为顶点j
34. if (visited[j]==0) //若j未访问过
35. {
36. visited[j]=1;
37. rear=(rear+1)%MAXV;
38. Qu[rear]=j; //进队
39. }
40. p=p->nextarc; //找下一个邻接点
41. }
42. }
43. return k;
44.}
45.
46.int main()
47.{
48. ALGraph *G;
49. int A[9][9]=
50. {
51. {0,1,1,0,0,0,0,0,0},
52. {0,0,0,1,1,0,0,0,0},
53. {0,0,0,0,1,1,0,0,0},
54. {0,0,0,0,0,0,1,0,0},
55. {0,0,0,0,0,1,1,0,0},
56. {0,0,0,0,0,0,0,1,0},
57. {0,0,0,0,0,0,0,1,1},
58. {0,0,0,0,0,0,0,0,1},
59. {0,0,0,0,0,0,0,0,0}
60. }; //请画出对应的有向图
61. ArrayToList(A[0], 9, G);
62. printf("离顶点0最远的顶点:%d",Maxdist(G,0));
63. return 0;
64.}
运行结果:
知识点总结:求不带权连通图中距离顶点最远的顶点k。
学习心得:这里采用广度优先的遍历算法,由于只需求一个顶点,不需求路径,所以采用的队列可以是环形队列。