图的存储结构

1)邻接矩阵

用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息。

2)邻接表

3)十字链表

4)邻接多重表

5)边集数组

本文只用代码实现用邻接矩阵方式存储图。忘见谅。

图的遍历

1)深度优先遍历(Depth_First_Search,DFS)

从图中某个顶点 v 出发,访问此顶点,然后从 v 的未被访问的邻接点出发深度优先遍历图,直至图中所有和 v 有路径相通的顶点都被访问到。--------递归思想

2)广度优先遍历(Breadth_First_Search,BFS)

类似于树的层序遍历-----------非递归,而是逐层遍历。

区别:深度优先遍历更适合目标比较明确,以找到目标为主要目的的情况,而广度优先更适合在不断扩大遍历范围时找到相对最优解的情况。

具体实现代码如下:

  1. /* Graph.h头文件 */
  2. #include<iostream>
  3. #include"LinkQueue.h"
  4. #define MAXVEX 100
  5. #define INFINITY 65535
  6. #define TRUE 1
  7. #define FALSE 0
  8. typedef char VertexType;
  9. typedef int EdgeType;
  10. typedef int Boolean;
  11. using namespace std;
  12.  
  13. /*邻接矩阵方式建立图*/
  14. class MGraph{
  15. public:
  16. VertexType vexs[MAXVEX];
  17. EdgeType arc[MAXVEX][MAXVEX];
  18. int numVertexes,numEdges;
  19. };
  20.  
  21. /*建立无向网图的邻接矩阵表示*/
  22. void CreateMGraph(MGraph *G)
  23. {
  24. int i,j,k,w;
  25. cout<<"输入顶点数和边数:"<<endl;
  26. cin>>G->numVertexes>>G->numEdges;
  27. cin.clear();
  28. cout<<"输入顶点信息:"<<endl;
  29. for(i=0;i<G->numVertexes;i++)
  30. {
  31. cin>>G->vexs[i];
  32. cin.clear();
  33. }
  34. for(i=0;i<G->numVertexes;i++)
  35. for(j=0;j<G->numVertexes;j++)
  36. G->arc[i][j]=INFINITY;
  37. for(k=0;k<G->numEdges;k++)
  38. {
  39. cout<<"输入边(vi,vj)上的下标i,下标j和权w:"<<endl;
  40. cin>>i>>j>>w;
  41. cin.clear();
  42. G->arc[i][j]=w;
  43. G->arc[j][i]=G->arc[i][j];
  44. }
  45. }
  46.  
  47. /*邻接矩阵的深度优先递归算法*/
  48. Boolean visited[MAXVEX]; /*访问标志的数组*/
  49. void DFS(MGraph G,int i)
  50. {
  51. int j;
  52. visited[i]=TRUE;
  53. cout<<G.vexs[i]; /*打印顶点,也可以其他操作*/
  54. for(j=0;j<G.numVertexes;j++)
  55. if(G.arc[i][j]==1 && !visited[j])
  56. DFS(G,j); /*对为访问的邻接顶点递归调用*/
  57. }
  58. /*邻接矩阵的深度优先遍历操作*/
  59. void DFSTraverse(MGraph G)
  60. {
  61. cout<<"\n深度优先遍历结果为:"<<endl;
  62. int i;
  63. for(i=0;i<G.numVertexes;i++)
  64. visited[i]=FALSE; /*初始化所有顶点状态都是未访问过状态*/
  65. for(i=0;i<G.numVertexes;i++)
  66. if(!visited[i]) /*对未访问过的顶点调用DFS,若是连通图,只会执行一次*/
  67. DFS(G,i);
  68. cout<<endl;
  69. }
  70.  
  71. /*邻接矩阵的广度遍历算法*/
  72. void BFSTraverse(MGraph G)
  73. {
  74. cout<<"广度优先遍历结果为:"<<endl;
  75. int i,j;
  76. LinkQueue Q;
  77. for(i=0;i<G.numVertexes;i++)
  78. visited[i]=FALSE;
  79. for(i=0;i<G.numVertexes;i++)
  80. {
  81. if(!visited[i])
  82. {
  83. visited[i]=TRUE;
  84. cout<<G.vexs[i];
  85. Q.EnQueue(i);
  86. while(!Q.QueueEmpty())
  87. {
  88. Q.DeQueue(&i);
  89. for(j=0;j<G.numVertexes;j++)
  90. {
  91. if(G.arc[i][j]==1 && !visited[j])
  92. {
  93. visited[j]=TRUE;
  94. cout<<G.vexs[j];
  95. Q.EnQueue(j);
  96. }
  97. }
  98. }
  99. }
  100. }
  101. cout<<endl;
  102. }

对于如下图这样的一个简单的图结构:

运行程序,结果如下:

C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)的更多相关文章

  1. K:图的存储结构

      常用的图的存储结构主要有两种,一种是采用数组链表(邻接表)的方式,一种是采用邻接矩阵的方式.当然,图也可以采用十字链表或者边集数组的方式来进行表示,但由于不常用,为此,本博文不对其进行介绍. 邻接 ...

  2. 图的存储结构(邻接矩阵与邻接表)及其C++实现

    一.图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合. 注: 在线性表中,元素个数可以为零, ...

  3. 【algo&ds】6.图及其存储结构、遍历

    1.什么是图 图表示"多对多"的关系 包含 一组顶点:通常用 V(Vertex)表示顶点集合 一组边:通常用 E(Edge)表示边的集合 边是顶点对:(v,w)∈ E,其中 v,w ...

  4. 【PHP数据结构】图的存储结构

    图的概念介绍得差不多了,大家可以消化消化再继续学习后面的内容.如果没有什么问题的话,我们就继续学习接下来的内容.当然,这还不是最麻烦的地方,因为今天我们只是介绍图的存储结构而已. 图的顺序存储结构:邻 ...

  5. 图的存储结构大赏------数据结构C语言(图)

    图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...

  6. 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

    如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...

  7. 图的理解:深度优先和广度优先遍历及其 Java 实现

    遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...

  8. 【PHP数据结构】图的遍历:深度优先与广度优先

    在上一篇文章中,我们学习完了图的相关的存储结构,也就是 邻接矩阵 和 邻接表 .它们分别就代表了最典型的 顺序存储 和 链式存储 两种类型.既然数据结构有了,那么我们接下来当然就是学习对这些数据结构的 ...

  9. 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)

    学习了图的深度优先和广度优先遍历,发现不管是教材还是网上,大都为C语言函数式实现,为了加深理解,我以C++面向对象的方式把图的深度优先和广度优先遍历重写了一遍. 废话不多说,直接上代码: #inclu ...

随机推荐

  1. (六)Jquery Mobile主题及插件的使用

    二.自定义主题      根据js自带的主题,提取出来进行更改 来自为知笔记(Wiz)

  2. ios中操作技巧

    1.配置字段快捷键: @property(nonatimic,copy) NSString *<#param#>; 2.NSNumber 转NSString 最快简单方式: NSNumbe ...

  3. mysql之SQL---存储过程

    1.存储过程简介  我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用 ...

  4. LPC1788系统时钟初始化

    #ifndef __SYS_H_ #define __SYS_H_ #include "common.h" #define SystemCoreClock  120000000  ...

  5. UIAlertController高级之嵌入其他控件

    在编码过程中,我们经常遇到需要这样一个效果,就是弹出框的嵌套; 举个最简单的例子,比如你要选择时间,必然需要一个时间选择器DatePicker.但是这个选择器又是在你点击某按钮时弹出,弹出方式最常见的 ...

  6. html 上传文件

    1.html代码 <form id="form1" action="TestYield" method="post" enctype= ...

  7. 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密

    在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...

  8. imagebutton、imageview的属性

    [转]http://blog.csdn.net/victoryckl/article/details/14162131 http://blog.sina.com.cn/s/blog_68b3fdc30 ...

  9. js排序算法汇总

    JS家的排序算法   十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外 ...

  10. sql server mdf碎片级数据库修复,数据库碎片级提取

    sql server mdf碎片级数据库修复,数据库碎片级提取   大家都知道MDF数据库文件一般都比较大,在磁盘中往往被存放到不连续的逻辑簇中,久而久之就形成了文件碎片,当文件被误删除或者格式化后, ...