分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

图的存储方式可以用邻接矩阵来表示,我们假定顶点序号从0开始,即图G的顶点集的一般形式是V(G)={v0,vi,…,Vn-1}。

以下代码测试过,为图的邻接矩阵表示方式。

[cpp] view plaincopyprint?
  1. /************************************************************************/
  2. /* 图的邻接矩阵存储结构                                                  */
  3. /************************************************************************/
  4. #include <stdio.h>
  5. #define MaxVertexNum 100
  6. #define QueueSize 30
  7. typedef enum{FALSE,TRUE}Boolean;
  8. Boolean visited[MaxVertexNum];
  9. typedef char VertexType;
  10. typedef int EdgeType;
  11. typedef struct
  12. {
  13. VertexType vexs[MaxVertexNum];  //顶点表
  14. EdgeType edges[MaxVertexNum][MaxVertexNum];     //邻接矩阵,可看做边表
  15. int n,e;    //图中当前的顶点数和边数
  16. }MGraph;
  17. /************************************************************************/
  18. /* 邻接矩阵的建立                                                        */
  19. /************************************************************************/
  20. void CreateMGraph(MGraph *G)
  21. {
  22. int i,j,k;
  23. char ch1,ch2;
  24. printf("请输入顶点数和边数(输入格式为:顶点数,边数):/n");
  25. scanf("%d,%d",&(G->n),&(G->e));
  26. printf("请输入顶点信息(顶点号<CR>)每个顶点以回车作为结束:/n");
  27. for(i=0;i<G->n;i++)
  28. {
  29. getchar();scanf("%c",&(G->vexs[i]));
  30. }
  31. for(i=0;i<G->n;i++)
  32. for(j=0;j<G->n;j++)
  33. G->edges[i][j]=0;
  34. printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):/n");
  35. for(k=0;k<G->e;k++)
  36. {
  37. getchar();
  38. printf("请输入第%d条边的顶点序号:",k+1);
  39. scanf("%c,%c",&ch1,&ch2);
  40. for(i=0;ch1!=G->vexs[i];i++);
  41. for(j=0;ch2!=G->vexs[j];j++);
  42. G->edges[i][j]=1;
  43. }
  44. }
  45. /************************************************************************/
  46. /* 深度优先遍历(深度优先搜索)                                         */
  47. /************************************************************************/
  48. void DFSM(MGraph *G,int i)
  49. {
  50. int j;
  51. printf("深度优先遍历结点: 结点%c/n",G->vexs[i]);   //访问顶点vi
  52. visited[i]=TRUE;
  53. for(j=0;j<G->n;j++)           //依次搜索vi邻接点
  54. if(G->edges[i][j]==1 && !visited[j])
  55. DFSM(G,j);
  56. }
  57. void DFSTraverseM(MGraph *G)
  58. {
  59. int i;
  60. for(i=0;i<G->n;i++)
  61. visited[i]=FALSE;
  62. for(i=0;i<G->n;i++)
  63. if(!visited[i])
  64. DFSM(G,i);
  65. }
  66. /************************************************************************/
  67. /* 广度优先遍历(广度优先搜索)                                         */
  68. /************************************************************************/
  69. typedef struct
  70. {
  71. int front;
  72. int rear;
  73. int count;
  74. int data[QueueSize];
  75. }CirQueue;
  76. void InitQueue(CirQueue *Q)
  77. {
  78. Q->front=Q->rear=0;
  79. Q->count=0;
  80. }
  81. int QueueEmpty(CirQueue *Q)
  82. {
  83. return Q->count=QueueSize;
  84. }
  85. int QueueFull(CirQueue *Q)
  86. {
  87. return Q->count==QueueSize;
  88. }
  89. void EnQueue(CirQueue *Q,int x)
  90. {
  91. if (QueueFull(Q))
  92. printf("Queue overflow");
  93. else
  94. {
  95. Q->count++;
  96. Q->data[Q->rear]=x;
  97. Q->rear=(Q->rear+1)%QueueSize;
  98. }
  99. }
  100. int DeQueue(CirQueue *Q)
  101. {
  102. int temp;
  103. if(QueueEmpty(Q))
  104. {
  105. printf("Queue underflow");
  106. return NULL;
  107. }
  108. else
  109. {
  110. temp=Q->data[Q->front];
  111. Q->count--;
  112. Q->front=(Q->front+1)%QueueSize;
  113. return temp;
  114. }
  115. }
  116. void BFSM(MGraph *G,int k)
  117. {
  118. int i,j;
  119. CirQueue Q;
  120. InitQueue(&Q);
  121. printf("广度优先遍历结点: 结点%c/n",G->vexs[k]);
  122. visited[k]=TRUE;
  123. EnQueue(&Q,k);
  124. while (!QueueEmpty(&Q))
  125. {
  126. i=DeQueue(&Q);
  127. for (j=0;j<G->n;j++)
  128. if(G->edges[i][j]==1&&!visited[j])
  129. {
  130. printf("广度优先遍历结点:%c/n",G->vexs[j]);
  131. visited[j]=TRUE;
  132. EnQueue(&Q,j);
  133. }
  134. }
  135. }
  136. void BFSTraverseM(MGraph *G)
  137. {
  138. int i;
  139. for (i=0;i<G->n;i++)
  140. visited[i]=FALSE;
  141. for (i=0;i<G->n;i++)
  142. if (!visited[i])
  143. BFSM(G,i);
  144. }
  145. /************************************************************************/
  146. /* 主函数调用                                                           */
  147. /************************************************************************/
  148. int main()
  149. {
  150. MGraph G;
  151. CreateMGraph(&G);
  152. DFSTraverseM(&G);
  153. BFSTraverseM(&G);
  154. return 0;
  155. }

/************************************************************************//* 图的邻接矩阵存储结构                                                  *//************************************************************************/#include <stdio.h>#define MaxVertexNum 100#define QueueSize 30typedef enum{FALSE,TRUE}Boolean;Boolean visited[MaxVertexNum];typedef char VertexType;typedef int EdgeType;typedef struct  { VertexType vexs[MaxVertexNum]; //顶点表 EdgeType edges[MaxVertexNum][MaxVertexNum];  //邻接矩阵,可看做边表 int n,e; //图中当前的顶点数和边数}MGraph;/************************************************************************//* 邻接矩阵的建立                                                        *//************************************************************************/void CreateMGraph(MGraph *G){  int i,j,k; char ch1,ch2; printf("请输入顶点数和边数(输入格式为:顶点数,边数):/n"); scanf("%d,%d",&(G->n),&(G->e)); printf("请输入顶点信息(顶点号<CR>)每个顶点以回车作为结束:/n"); for(i=0;i<G->n;i++) {  getchar();scanf("%c",&(G->vexs[i])); } for(i=0;i<G->n;i++)  for(j=0;j<G->n;j++)   G->edges[i][j]=0;  printf("请输入每条边对应的两个顶点的序号(输入格式为:i,j):/n");  for(k=0;k<G->e;k++)  {   getchar();   printf("请输入第%d条边的顶点序号:",k+1);   scanf("%c,%c",&ch1,&ch2);   for(i=0;ch1!=G->vexs[i];i++);   for(j=0;ch2!=G->vexs[j];j++);   G->edges[i][j]=1;  }}/************************************************************************//* 深度优先遍历(深度优先搜索)                                         *//************************************************************************/void DFSM(MGraph *G,int i){ int j; printf("深度优先遍历结点: 结点%c/n",G->vexs[i]); //访问顶点vi visited[i]=TRUE;   for(j=0;j<G->n;j++)   //依次搜索vi邻接点  if(G->edges[i][j]==1 && !visited[j])   DFSM(G,j);}void DFSTraverseM(MGraph *G){ int i; for(i=0;i<G->n;i++)  visited[i]=FALSE;  for(i=0;i<G->n;i++)  if(!visited[i])    DFSM(G,i);}/************************************************************************//* 广度优先遍历(广度优先搜索)                                         *//************************************************************************/typedef struct{ int front; int rear; int count; int data[QueueSize];}CirQueue;void InitQueue(CirQueue *Q){ Q->front=Q->rear=0; Q->count=0;}int QueueEmpty(CirQueue *Q){ return Q->count=QueueSize;}int QueueFull(CirQueue *Q){ return Q->count==QueueSize;}void EnQueue(CirQueue *Q,int x){  if (QueueFull(Q))  printf("Queue overflow"); else {   Q->count++;  Q->data[Q->rear]=x;  Q->rear=(Q->rear+1)%QueueSize; }}int DeQueue(CirQueue *Q){ int temp; if(QueueEmpty(Q)) {   printf("Queue underflow");  return NULL; } else {  temp=Q->data[Q->front];  Q->count--;  Q->front=(Q->front+1)%QueueSize;  return temp; }}void BFSM(MGraph *G,int k){  int i,j; CirQueue Q; InitQueue(&Q); printf("广度优先遍历结点: 结点%c/n",G->vexs[k]); visited[k]=TRUE; EnQueue(&Q,k); while (!QueueEmpty(&Q)) {  i=DeQueue(&Q);  for (j=0;j<G->n;j++)   if(G->edges[i][j]==1&&!visited[j])   {    printf("广度优先遍历结点:%c/n",G->vexs[j]);    visited[j]=TRUE;    EnQueue(&Q,j);   } }}void BFSTraverseM(MGraph *G){ int i; for (i=0;i<G->n;i++)  visited[i]=FALSE; for (i=0;i<G->n;i++)  if (!visited[i])    BFSM(G,i);}/************************************************************************//* 主函数调用                                                           *//************************************************************************/int main(){ MGraph G; CreateMGraph(&G); DFSTraverseM(&G); BFSTraverseM(&G); return 0;}

测试结构如下(含测试数据):

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

图---邻接矩阵 建立,深度遍历,广度遍历相关推荐

  1. 数据结构【图】—022邻接矩阵的深度和广度遍历

    1 #include "000库函数.h" 2 //无向图 3 4 typedef char VertexType; /* 顶点类型应由用户定义 */ 5 typedef int ...

  2. 数据结构 - 图的基本操作 深度和广度遍历

    ##代码实现 ###main.cpp(主函数) #include <iostream> #include "CMap.h" using namespace std;/* ...

  3. 数据结构【图】—023邻接表深度和广度遍历

    1 #include "000库函数.h" 2 //无向图 3 4 #define MAXSIZE 9 /* 存储空间初始分配量 */ 5 #define MAXEDGE 15 6 ...

  4. 树与树算法二叉树的层次遍历/广度遍历/深度遍历详解与代码实现

    一. 树与树算法 1.1树的概念   树(tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...

  5. 二叉树层次遍历--广度遍历和深度遍历

    问题来源:二叉树层次遍历 问题描述:给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例子: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 ...

  6. 图 邻接表 建立 深度遍历 广度遍历

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 图的邻接 ...

  7. 有向图的深度和广度遍历

    题目要求: 1.对于下图所示的有向图(访问顺序按序号从小到大),试写出: (1) 从顶点①出发进行深度优先搜索所得到的深度优先生成树: (2) 从顶点②出发进行广度优先搜索所得到的广度优先生成树. p ...

  8. js中树形结构的深度遍历与广度遍历

    树形结构的深度遍历与广度遍历 定义 深度遍历:一个树形结构中,由一个数据分支全部遍历完才去遍历另外一个分支,直至全部数据遍历完成. 广度遍历:先遍历最外层的分支数据,然后一层一层的进行深入遍历,直至全 ...

  9. js实现深度遍历与广度遍历

    题目:省份数量 有 n 个城市,其中一些彼此相连,另一些没有相连.如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连. 省份 是一组直接或间接相连 ...

最新文章

  1. 读文件 —— WEB前端读取本地文件内容哪些事(前台解析txt文件)……
  2. 华为内部面试题库---(10)
  3. Mac安装PhoneGap3
  4. 登录环境故障的原理及解决办法? -bash-4.1$ -bash-4.1$
  5. C语言——vs2010的使用 || C语言入门知识
  6. Hibernate之检索方式(HQL/QBC/本地SQL)
  7. python中方法调用方法_Python中实现结构相似的函数调用方法
  8. 什么是微调(Fine Tune)?什么时候使用什么样的微调?【数据量和数据相似度决定】
  9. Oracle GoldenGate For Big Data - Kafka Handler
  10. System verilog随机系统函数$urandom使用方法
  11. Reflexer Labs将于4月15日进行首次FLX代币分配
  12. 中国内部物流输送系统市场趋势报告、技术动态创新及市场预测
  13. LeetCode刷题——209. 长度最小的子数组
  14. matlab用pathy语言,2018 年度编程语言 -- Python
  15. Python基础090:解决jupyter notebook无法自动跳转chrome浏览器的问题
  16. 分享两个软件,listary和Snipaste,以及Listary的配置文件
  17. c语言编写墓碑上的字符,恶的大写字母是什么
  18. 蓝字冲销是什么意思_会计记账,贷方红字,贷方蓝字什么意思
  19. java rsi_高频交易算法研发心得--RSI指标及应用
  20. STM32学习1——环境搭建

热门文章

  1. 使用spring-loaded实现应用热部署
  2. 微信小程序多块元素横排列、中排列、下划线
  3. JavaScript -- arguments、apply 、call、bind
  4. C 语言实例 - 判断三边能否构成三角形
  5. C#LeetCode刷题之#111-二叉树的最小深度​​​​​​​(Minimum Depth of Binary Tree)
  6. css一行点点点_如何通过一点点创意使CSS成为不可能
  7. tmux 上滚_实践中的tmux:回滚缓冲区
  8. 论坛分页频繁更新帖子缓存_如何实现频繁更改内容的“可缓存”分页
  9. 多元线性回归matlab代码例题_多元线性回归matlab程序
  10. simulink模块使用记录2-EnabledSubsystem/merge