当前位置:   article > 正文

【数据结构与算法】使用邻接表实现AOV网的拓扑排序算法(头歌)_aov网的存储结构为邻接表,要求编写函数实现aov网的拓扑排序算法。

aov网的存储结构为邻接表,要求编写函数实现aov网的拓扑排序算法。

任务描述

本关任务:用邻接表存储有向图,在顶点表中增加入度域,使用队列存储入度为零的顶点编号,实现AOV网的拓扑排序算法,并输出拓扑序列,顶点个数少于20个。

编程要求

根据提示,在右侧编辑器补充代码。

测试说明

输入描述

首先输入图中顶点个数和边的条数; 输入顶点的信息(字符型); 输入各顶点的入度; 输入各边及其权值。

输出描述

输出 AOV 网的拓扑序列(顶点信息),以空格隔开,最后一个顶点后面有空格,如果AOV网存在回路,输出"有回路"的信息,占一行。

输入样例1:

  1. 6 9
  2. A B C D E F
  3. 3 0 1 3 0 2
  4. 1 0
  5. 1 3
  6. 2 0
  7. 2 3
  8. 3 0
  9. 3 5
  10. 4 2
  11. 4 3
  12. 4 5

输出样例1:

B E C D F A

输入样例2:

  1. 6 8
  2. A B C D E F
  3. 0 0 1 3 2 2
  4. 0 2
  5. 0 3
  6. 1 3
  7. 1 5
  8. 2 4
  9. 3 4
  10. 4 5
  11. 5 3

输出样例2:

有回路

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // 定义弧节点
  4. struct Arcnode
  5. {
  6. int adjvex; // 弧的终点顶点下标
  7. struct Arcnode *next; // 指向下一个弧节点的指针
  8. };
  9. // 定义顶点节点
  10. struct Vertexnode
  11. {
  12. int in; // 顶点的入度
  13. char vertex; // 顶点的值
  14. struct Arcnode *firstedge; // 指向第一个弧节点的指针
  15. };
  16. #define Maxsize 20
  17. // 定义邻接表图结构
  18. typedef struct
  19. {
  20. struct Vertexnode adjlist[Maxsize]; // 顶点数组
  21. int vertexnum; // 顶点数量
  22. int arcnum; // 弧数量
  23. } ALgraph;
  24. // 初始化邻接表图结构
  25. void ALgraph_init(ALgraph *G, char a[], int n, int e)
  26. {
  27. //write your code
  28. //=======begin=======
  29. G->vertexnum = n; G->arcnum = e;
  30. int i, j;
  31. struct Arcnode *s, *r;
  32. for (int i=0; i<n; i++)
  33. {
  34. G->adjlist[i].vertex = a[i];
  35. G->adjlist[i].firstedge = NULL;
  36. scanf("%d ", &G->adjlist[i].in);
  37. }
  38. for (int k=0; k<e; k++)
  39. {
  40. scanf("%d %d", &i, &j);
  41. s = (struct Arcnode*)malloc(sizeof(struct Arcnode));
  42. s->adjvex = j;
  43. s->next = G->adjlist[i].firstedge;
  44. G->adjlist[i].firstedge = s;
  45. }
  46. //========end========
  47. }
  48. // 销毁邻接表图结构
  49. void ALgraph_destroy(ALgraph *G)
  50. {
  51. int i;
  52. struct Arcnode *p;
  53. for (i = 0; i < G->vertexnum; i++)
  54. {
  55. p = G->adjlist[i].firstedge;
  56. while (p)
  57. {
  58. struct Arcnode *q = p;
  59. p = p->next;
  60. free(q);
  61. }
  62. }
  63. }
  64. // 拓扑排序
  65. void ALgraph_TopSort(ALgraph *G)
  66. {
  67. //write your code
  68. //=======begin=======
  69. int front = -1, rear = -1, count = 0, x, k, q[Maxsize], len = 0;
  70. char s[Maxsize];
  71. struct Arcnode *p;
  72. for (int i=0; i<G->vertexnum; i++)
  73. {
  74. if (G->adjlist[i].in == 0)
  75. {
  76. q[++rear] = i;
  77. }
  78. }
  79. while (front != rear)
  80. {
  81. x = q[++front];
  82. s[len++] = G->adjlist[x].vertex;
  83. count++;
  84. p = G->adjlist[x].firstedge;
  85. while (p)
  86. {
  87. k = p->adjvex;
  88. G->adjlist[k].in--;
  89. if (G->adjlist[k].in == 0)
  90. {
  91. q[++rear] = k;
  92. }
  93. p = p->next;
  94. }
  95. }
  96. if (count < G->vertexnum)
  97. {
  98. printf("有回路");
  99. }
  100. else
  101. {
  102. for (int i=0; i<len; i++)
  103. {
  104. printf("%c ", s[i]);
  105. }
  106. }
  107. //========end========
  108. }
  109. int main()
  110. {
  111. int i, n, m;
  112. scanf("%d%d", &n, &m);
  113. // 动态申请字符数组
  114. char *b = (char *)malloc(sizeof(char) * n);
  115. for (i = 0; i < n; i++)
  116. {
  117. scanf(" %c", &b[i]);
  118. }
  119. ALgraph al;
  120. ALgraph_init(&al, b, n, m);
  121. ALgraph_TopSort(&al);
  122. ALgraph_destroy(&al);
  123. // 释放内存
  124. free(b);
  125. return 0;
  126. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/870801
推荐阅读
相关标签
  

闽ICP备14008679号