97.png

    1. /*
    2. 分别采用深度优先遍历和广度优先遍历判断是否存在由vi到vj的路径,图用邻接表存储
    3. 分析:
    4. 采用深度优先:我们从vi顶点开始进行深度遍历,若若存在路径则必然可以走到vj顶点处;
    5. 采用广度优先:同样从vi顶点开始进行广度遍历,若存在则必然可以走到vj顶点处。
    6. */
    7. #define _CRT_SECURE_NO_WARNINGS
    8. #define MAXSIZE 100
    9. #include <stdio.h>
    10. #include <stdlib.h>
    11. typedef struct EdgeNode {//边表结点
    12. int index;//该边所指向的顶点的位置
    13. int weight;//权值
    14. EdgeNode *next;//下一个邻接边
    15. }EdgeNode;
    16. typedef struct VertexNode {//顶点表节点
    17. char info;//顶点信息
    18. EdgeNode *firstEdge;//指向第一条依附该顶点的边的指针
    19. }VertexNode, Adjlist[MAXSIZE];
    20. typedef struct {
    21. Adjlist adjlist;//顶点数组
    22. int numE, numV;//边数、顶点数
    23. }ALGraph;
    24. //链队
    25. struct Link {
    26. int node;//我们进行广度优先时会用到,将顶点序号入队
    27. struct Link *next;
    28. };
    29. struct LinkQueue {
    30. struct Link *front, *rear;
    31. };
    32. void DFS(ALGraph *G, int vi, int vj, int *visited, int &flag) {
    33. for (EdgeNode *p = G->adjlist[vi].firstEdge; p; p = p->next) {
    34. if (!visited[p->index]) {
    35. visited[p->index] = 1;
    36. if (p->index == vj) {//此时找到终止顶点
    37. flag = 1;
    38. }
    39. DFS(G, p->index, vj, visited, flag);
    40. }
    41. }
    42. }
    43. bool judgeRouteInDFS(ALGraph *G, int vi, int vj) {//传入图G,路线端点vi vj
    44. int *visited = (int *)malloc(sizeof(int)*G->numV);
    45. int flag = 0;//进入递归,路径存在标志
    46. for (int i = 0; i < G->numV; i++) {
    47. visited[i] = 0;//初始化
    48. }
    49. if (!visited[vi]) {
    50. visited[vi] = 1;
    51. DFS(G, vi, vj, visited, flag);
    52. }
    53. if (flag) {
    54. return 1;
    55. }
    56. else {
    57. return 0;
    58. }
    59. }
    60. bool judgeRouteInBFS(ALGraph *G, int vi, int vj) {
    61. int *visited = (int *)malloc(sizeof(int)*G->numV);
    62. int flag = 0;//进入递归,路径存在标志
    63. int index;//进行判断用
    64. for (int i = 0; i < G->numV; i++) {
    65. visited[i] = 0;//初始化
    66. }
    67. bool isEmpty(LinkQueue *lq);
    68. bool enQueue(LinkQueue *, int);
    69. bool deQueue(LinkQueue *, int*);
    70. LinkQueue *create();//声明创建队列的方法。广度优先遍历需要用到队列
    71. LinkQueue *lq;
    72. lq = create();
    73. if (!visited[vi]) {
    74. visited[vi] = 1;
    75. enQueue(lq, vi);//入队
    76. }
    77. while (!isEmpty(lq)) {//当队列不空,取出队首元素进行判断
    78. deQueue(lq, &index);
    79. if (!visited[index]) {//若未曾访问过,进行判断
    80. visited[index] = 1;
    81. if (vj == index) {
    82. flag = 1;
    83. }
    84. }
    85. for (EdgeNode *p = G->adjlist[index].firstEdge; p; p = p->next) {
    86. if (!visited[p->index]) {
    87. enQueue(lq, p->index);//把所有的未访问过得邻接顶点入队
    88. }
    89. }
    90. }
    91. return flag;
    92. }
    93. int main() {
    94. int haveRoute;
    95. void createGraphInFile(ALGraph *);
    96. ALGraph *G = (ALGraph *)malloc(sizeof(ALGraph *));
    97. createGraphInFile(G);//创建图
    98. int vi, vj;
    99. printf("请输入vi,vj\n");
    100. printf("vi= ");
    101. scanf("%d", &vi);
    102. printf("vj= ");
    103. scanf("%d", &vj);
    104. while (vi > G->numV || vj > G->numV) {
    105. printf("输入有误,不存在该顶点,请重新输入!");
    106. printf("vi= ");
    107. scanf("%d", &vi);
    108. printf("vj= ");
    109. scanf("%d", &vj);
    110. }
    111. //haveRoute = judgeRouteInBFS(G, vi - 1, vj - 1);
    112. haveRoute = judgeRouteInDFS(G, vi - 1, vj - 1);
    113. if (haveRoute) {
    114. printf("顶点%d到顶点%d存在路径", vi, vj);
    115. }
    116. else {
    117. printf("%d到%d不存在路径", vi, vj);
    118. }
    119. return 0;
    120. }