严蔚敏C语言无向图BFS和DFS代码实现

x33g5p2x  于2022-05-23 转载在 其他  
字(2.8k)|赞(0)|评价(0)|浏览(297)

完整代码

  1. #include<iostream>
  2. using namespace std;
  3. #define MVNum 100 //最大顶点数
  4. #define OK 1
  5. #define ERROR 0
  6. #define OVERFLOW -2
  7. #define MAXSIZE 10
  8. typedef int Status;
  9. typedef struct {
  10. char vexs[MVNum];//顶点表
  11. int arcs[MVNum][MVNum];//邻接矩阵
  12. int vexnum,arcnum;//顶点数和边数
  13. }AMGraph;
  14. /*返回顶点在顶点表中的位置*/
  15. int LocateVex(AMGraph G,char v){
  16. for (int i = 0; i < G.vexnum; ++i) {
  17. if (v == G.vexs[i]){
  18. return i;
  19. }
  20. }
  21. }
  22. /*创建无向图*/
  23. Status CreateUDN(AMGraph &G){
  24. cout<<"请输入顶点数和边数"<<endl;
  25. cin>>G.vexnum>>G.arcnum;
  26. //将顶点存入顶点表
  27. for (int i = 0; i < G.vexnum; ++i) {
  28. cout<<"输入第"<<(i+1)<<"顶点"<<endl;
  29. cin>>G.vexs[i];
  30. }
  31. //初始化矩阵
  32. for (int j = 0; j < G.vexnum; ++j) {
  33. for (int i = 0; i < G.vexnum; ++i) {
  34. G.arcs[j][i] = 0;
  35. }
  36. }
  37. //初始化无向图
  38. for (int k = 0; k < G.arcnum; ++k) {
  39. char v1,v2;
  40. cout<<"输入第"<<k<<"边的两个顶点(空格隔开 例:a b)"<<endl;
  41. cin>>v1>>v2;
  42. int i = LocateVex(G,v1);
  43. int j = LocateVex(G,v2);
  44. G.arcs[i][j] = 1;
  45. G.arcs[j][i] = 1;
  46. }
  47. return OK;
  48. }
  49. bool visited[MVNum];
  50. /*深度优先遍历DFS*/
  51. void DFS_AM(AMGraph G,int v,bool visited[]){
  52. cout<<G.vexs[v];
  53. //将访问过的结点置为true
  54. visited[v] = true;
  55. //依次检查v所在的行
  56. for (int w = 0; w < G.vexnum; ++w) {
  57. //w是v的邻接点
  58. if (G.arcs[v][w] != 0 && (!visited[w]))
  59. DFS_AM(G,w,visited);
  60. }
  61. }
  62. typedef struct {
  63. int *base;//存储空间的基地址
  64. int front;//头指针
  65. int rear;//尾指针
  66. }SqQueue;
  67. /*初始化队列*/
  68. Status InitQueue(SqQueue &Q){
  69. Q.base = new int[MAXSIZE];
  70. if (!Q.base) exit(OVERFLOW);//存储空间分配失败
  71. Q.front = Q.rear = 0;//头尾指针置零
  72. return OK;
  73. }
  74. /*循环队列入队*/
  75. Status EnQueue(SqQueue &Q,int e){
  76. if ((Q.rear+1)%MAXSIZE == Q.front) //(循环)队列满了
  77. return ERROR;
  78. Q.base[Q.rear] = e;//在队尾插入元素
  79. Q.rear = (Q.rear+1)%MAXSIZE;//队尾指针加1
  80. return OK;
  81. }
  82. /*循环队列出队*/
  83. Status DeQueue(SqQueue &Q,int &e){
  84. if (Q.front == Q.rear)//对空
  85. return ERROR;
  86. e = Q.base[Q.front];
  87. Q.front = (Q.front+1)%MAXSIZE;//对头指针加1
  88. return OK;
  89. }
  90. bool QueueEmpty(SqQueue Q){
  91. if (Q.front == Q.rear)
  92. return true;
  93. return false;
  94. }
  95. /*获取第一个邻接结点*/
  96. int FirstAdjVex(AMGraph G,int v){
  97. for (int i = 0; i < G.vexnum; ++i) {
  98. if(G.arcs[v][i] != 0)
  99. return i;
  100. }
  101. }
  102. /*获取下一个邻接点*/
  103. int NextAdjVex(AMGraph G,int u,int w){
  104. for (int i = w+1; i < G.vexnum; ++i) {
  105. if (G.arcs[u][i] != 0)
  106. return i;
  107. }
  108. return -1;
  109. }
  110. /*广度优先遍历*/
  111. void BFS_AM(AMGraph G,int v,bool visited[]){
  112. cout<<G.vexs[v];
  113. visited[v] = true;
  114. SqQueue Q;
  115. InitQueue(Q);
  116. EnQueue(Q,v);
  117. while (!QueueEmpty(Q)){
  118. int u;
  119. DeQueue(Q,u);
  120. for (int w = FirstAdjVex(G,u); w >=0 ; w=NextAdjVex(G,u,w)) {
  121. if(!visited[w]){
  122. cout<<G.vexs[w];
  123. visited[w] = true;
  124. EnQueue(Q,w);
  125. }
  126. }
  127. }
  128. }
  129. int main(){
  130. AMGraph G;
  131. CreateUDN(G);
  132. for (int i = 0; i < MVNum; ++i) {
  133. visited[i] = false;
  134. }
  135. cout<<"深度优先算法"<<endl;
  136. DFS_AM(G,0,visited);
  137. for (int i = 0; i < MVNum; ++i) {
  138. visited[i] = false;
  139. }
  140. cout<<endl<<"广度优先算法"<<endl;
  141. BFS_AM(G,0,visited);
  142. return 0;
  143. }

测试

  1. 请输入顶点数和边数
  2. 5 6
  3. 输入第1顶点
  4. a
  5. 输入第2顶点
  6. b
  7. 输入第3顶点
  8. c
  9. 输入第4顶点
  10. d
  11. 输入第5顶点
  12. e
  13. 输入第0边的两个顶点(空格隔开 例:a b)
  14. a b
  15. 输入第1边的两个顶点(空格隔开 例:a b)
  16. a d
  17. 输入第2边的两个顶点(空格隔开 例:a b)
  18. c b
  19. 输入第3边的两个顶点(空格隔开 例:a b)
  20. c d
  21. 输入第4边的两个顶点(空格隔开 例:a b)
  22. c e
  23. 输入第5边的两个顶点(空格隔开 例:a b)
  24. b e
  25. 深度优先算法
  26. abcde
  27. 广度优先算法
  28. abdce
  29. Process finished with exit code 0

相关文章