• 实现图的遍历


    1. 实现图的深度优先遍历算法
    2. 实现图的广度优先遍历算法
      1. //MGraph.h
      2. typedef enum{DG,DN,UDG,UDN} GraphKind;//图的种类
      3. //弧结点结构
      4. typedef struct{
      5. char vertex[20];//顶点数组
      6. int arcs[20][20];//邻接矩阵
      7. int vexnum,arcnum;//顶点数和弧数
      8. GraphKind kind;
      9. }AdjMatrix;
      1. //图的遍历
      2. #include
      3. #include"MGraph.h"
      4. #include
      5. #define TRUE 1
      6. #define FALSE 0
      7. using namespace std;
      8. typedef struct Node
      9. {
      10. int data;
      11. struct Node* next;
      12. }LinkQueueNode;
      13. typedef struct
      14. {
      15. LinkQueueNode* front;
      16. LinkQueueNode* rear;
      17. }LinkQueue;
      18. int visited[20];
      19. int visitedBFS[20]={0};
      20. void DepthFirstSearch(AdjMatrix g,int v0);
      21. void BreadthFirstSearch(AdjMatrix g);
      22. int main()
      23. {
      24. AdjMatrix am;
      25. cout<<"请输入顶点数:";
      26. cin>>am.vexnum;
      27. if(am.vexnum>20)
      28. {
      29. cout<<"输入数值过大!"<
      30. return 0;
      31. }
      32. cout<<"请依次输入各顶点:";
      33. for(int i=0;i
      34. {
      35. cin>>am.vertex[i];
      36. }
      37. cout<<"请依次输入各边权值:"<
      38. for(int i=0;i
      39. {
      40. for(int j=0;j
      41. {
      42. cin>>am.arcs[i][j];
      43. }
      44. }
      45. cout<<" ";
      46. for(int i=0;i
      47. {
      48. cout<" ";
      49. }
      50. cout<
      51. for(int i=0;i
      52. {
      53. cout<" ";
      54. for(int j=0;j
      55. {
      56. cout<" ";
      57. }
      58. cout<
      59. }
      60. cout<<"深度优先遍历序列为:";
      61. DepthFirstSearch(am,0);
      62. cout<
      63. cout<<"广度优先遍历序列为:";
      64. BreadthFirstSearch(am);
      65. return 0;
      66. }
      67. void DepthFirstSearch(AdjMatrix g,int v0) /* 图g为邻接矩阵类型AdjMatrix */
      68. //函数参数g代表要处理的图,v0代表当前访问的顶点
      69. {
      70. cout<
      71. visited[v0]=1;//标记该顶点已被输出
      72. for(int vj=0;vj
      73. {
      74. //利用for循环找到该顶点的邻接点,并判断是否未被输出
      75. if(!visited[vj]&&g.arcs[v0][vj]!=0)
      76. DepthFirstSearch(g,vj);//找到之后以该邻接点为顶点进行递归
      77. }
      78. }
      79. int InitQueue(LinkQueue *Q)
      80. {
      81. /* 将Q初始化为一个空的链队列 */
      82. Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
      83. if(Q->front!=NULL)
      84. {
      85. Q->rear=Q->front;
      86. Q->front->next=NULL;
      87. return(TRUE);
      88. }
      89. else
      90. return(FALSE); /* 溢出!*/
      91. }
      92. int EnterQueue(LinkQueue *Q,int x)
      93. {
      94. /* 将数据元素x插入到队列Q中 */
      95. LinkQueueNode *NewNode;
      96. NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
      97. if(NewNode!=NULL)
      98. {
      99. NewNode->data=x;
      100. NewNode->next=NULL;
      101. Q->rear->next=NewNode;
      102. Q->rear=NewNode;
      103. return(TRUE);
      104. }
      105. else
      106. return(FALSE); /* 溢出!*/
      107. }
      108. int DeleteQueue(LinkQueue *Q)
      109. {
      110. /* 将队列Q的队头元素出队 */
      111. LinkQueueNode *p;
      112. if(Q->front==Q->rear)
      113. return(FALSE);
      114. p=Q->front->next;
      115. Q->front->next=p->next; /* 队头元素p出队 */
      116. if(Q->rear==p) /* 如果队中只有一个元素p,则p出队后成为空队 */
      117. Q->rear=Q->front;
      118. free(p); /* 释放存储空间 */
      119. return(TRUE);
      120. }
      121. int JudgeQueue(LinkQueue *Q)
      122. {
      123. if(Q->front==Q->rear)
      124. {
      125. return 0;
      126. }
      127. else
      128. {
      129. return 1;
      130. }
      131. }
      132. int FindVertex(AdjMatrix g,int k) //传入无向图G,要查找节点的位序k
      133. {
      134. if(k>=g.vexnum || k<0 )
      135. {
      136. return -1;
      137. } //参数不合理直接返回ERROR
      138. int i;
      139. for(i=0;i
      140. {
      141. if(g.arcs[k][i]==1) //遍历位序为k的节点的 关系数组行,
      142. return i;
      143. } //找到的话返回位序,否则最后返回ERROR
      144. return -1;
      145. }
      146. int NextAdjvex(AdjMatrix g,int k,int m)
      147. //传入无向图G,要查找节点的位序k,要找的临接点的起始位序的前一位m
      148. {
      149. if(k>=g.vexnum|| k<0 || m>=g.vexnum-1 || m<0)
      150. return -1; //参数不合理直接返回ERROR
      151. int i;
      152. for(i=m+1;i
      153. if(g.arcs[k][i]==1) //从m+1开始遍历位序为k的节点的 关系数组行,
      154. return i; //找到的话返回位序,否则最后返回ERROR
      155. return -1;
      156. }
      157. void BreadthFirstSearch(AdjMatrix g)
      158. {
      159. LinkQueue Q;
      160. InitQueue(&Q);
      161. int m,e;
      162. for (int i=0;i
      163. {
      164. if (!visitedBFS[i])
      165. {
      166. visitedBFS[i] = 1;
      167. cout<
      168. EnterQueue(&Q, i); // 顶点i入队列
      169. while (JudgeQueue(&Q)) {
      170. e=i;
      171. DeleteQueue(&Q);
      172. for (m = FindVertex(g, e); m != -1; m = NextAdjvex(g, e, m))
      173. // 检测i的所有邻接顶点
      174. {
      175. if (!visitedBFS[m]) // m为i尚未访问的邻接顶点
      176. {
      177. visitedBFS[m] = 1; // 访问顶点m,做标记
      178. cout<
      179. EnterQueue(&Q, m); // 顶点m入队列
      180. }
      181. }
      182. }
      183. }
      184. }
      185. }

  • 相关阅读:
    相机解析力调试总结
    如何使用ChatGPT构建一个Web应用程序?
    vue中组件间的通信
    TFM—用于实时监控和数据管理的远程试验管理平台
    【每日一题】1041. 困于环中的机器人
    Java 常用Set集合和常用Map集合
    首个多云检索开源项目 Clusterpedia 正式进入 CNCF 沙箱
    springboot集成kafka
    微信支付及支付回调
    使用 OpenCV 进行 YOLO 对象检测
  • 原文地址:https://blog.csdn.net/Shenrunchen/article/details/128155102