C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
图的存储结构
1)邻接矩阵
用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息。
2)邻接表
3)十字链表
4)邻接多重表
5)边集数组
本文只用代码实现用邻接矩阵方式存储图。忘见谅。
图的遍历
1)深度优先遍历(Depth_First_Search,DFS)
从图中某个顶点 v 出发,访问此顶点,然后从 v 的未被访问的邻接点出发深度优先遍历图,直至图中所有和 v 有路径相通的顶点都被访问到。--------递归思想
2)广度优先遍历(Breadth_First_Search,BFS)
类似于树的层序遍历-----------非递归,而是逐层遍历。
区别:深度优先遍历更适合目标比较明确,以找到目标为主要目的的情况,而广度优先更适合在不断扩大遍历范围时找到相对最优解的情况。
具体实现代码如下:
- /* Graph.h头文件 */
- #include<iostream>
- #include"LinkQueue.h"
- #define MAXVEX 100
- #define INFINITY 65535
- #define TRUE 1
- #define FALSE 0
- typedef char VertexType;
- typedef int EdgeType;
- typedef int Boolean;
- using namespace std;
- /*邻接矩阵方式建立图*/
- class MGraph{
- public:
- VertexType vexs[MAXVEX];
- EdgeType arc[MAXVEX][MAXVEX];
- int numVertexes,numEdges;
- };
- /*建立无向网图的邻接矩阵表示*/
- void CreateMGraph(MGraph *G)
- {
- int i,j,k,w;
- cout<<"输入顶点数和边数:"<<endl;
- cin>>G->numVertexes>>G->numEdges;
- cin.clear();
- cout<<"输入顶点信息:"<<endl;
- for(i=0;i<G->numVertexes;i++)
- {
- cin>>G->vexs[i];
- cin.clear();
- }
- for(i=0;i<G->numVertexes;i++)
- for(j=0;j<G->numVertexes;j++)
- G->arc[i][j]=INFINITY;
- for(k=0;k<G->numEdges;k++)
- {
- cout<<"输入边(vi,vj)上的下标i,下标j和权w:"<<endl;
- cin>>i>>j>>w;
- cin.clear();
- G->arc[i][j]=w;
- G->arc[j][i]=G->arc[i][j];
- }
- }
- /*邻接矩阵的深度优先递归算法*/
- Boolean visited[MAXVEX]; /*访问标志的数组*/
- void DFS(MGraph G,int i)
- {
- int j;
- visited[i]=TRUE;
- cout<<G.vexs[i]; /*打印顶点,也可以其他操作*/
- for(j=0;j<G.numVertexes;j++)
- if(G.arc[i][j]==1 && !visited[j])
- DFS(G,j); /*对为访问的邻接顶点递归调用*/
- }
- /*邻接矩阵的深度优先遍历操作*/
- void DFSTraverse(MGraph G)
- {
- cout<<"\n深度优先遍历结果为:"<<endl;
- int i;
- for(i=0;i<G.numVertexes;i++)
- visited[i]=FALSE; /*初始化所有顶点状态都是未访问过状态*/
- for(i=0;i<G.numVertexes;i++)
- if(!visited[i]) /*对未访问过的顶点调用DFS,若是连通图,只会执行一次*/
- DFS(G,i);
- cout<<endl;
- }
- /*邻接矩阵的广度遍历算法*/
- void BFSTraverse(MGraph G)
- {
- cout<<"广度优先遍历结果为:"<<endl;
- int i,j;
- LinkQueue Q;
- for(i=0;i<G.numVertexes;i++)
- visited[i]=FALSE;
- for(i=0;i<G.numVertexes;i++)
- {
- if(!visited[i])
- {
- visited[i]=TRUE;
- cout<<G.vexs[i];
- Q.EnQueue(i);
- while(!Q.QueueEmpty())
- {
- Q.DeQueue(&i);
- for(j=0;j<G.numVertexes;j++)
- {
- if(G.arc[i][j]==1 && !visited[j])
- {
- visited[j]=TRUE;
- cout<<G.vexs[j];
- Q.EnQueue(j);
- }
- }
- }
- }
- }
- cout<<endl;
- }
对于如下图这样的一个简单的图结构:
运行程序,结果如下:
C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)的更多相关文章
- K:图的存储结构
常用的图的存储结构主要有两种,一种是采用数组链表(邻接表)的方式,一种是采用邻接矩阵的方式.当然,图也可以采用十字链表或者边集数组的方式来进行表示,但由于不常用,为此,本博文不对其进行介绍. 邻接 ...
- 图的存储结构(邻接矩阵与邻接表)及其C++实现
一.图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为: G=(V,E) 其中:G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合. 注: 在线性表中,元素个数可以为零, ...
- 【algo&ds】6.图及其存储结构、遍历
1.什么是图 图表示"多对多"的关系 包含 一组顶点:通常用 V(Vertex)表示顶点集合 一组边:通常用 E(Edge)表示边的集合 边是顶点对:(v,w)∈ E,其中 v,w ...
- 【PHP数据结构】图的存储结构
图的概念介绍得差不多了,大家可以消化消化再继续学习后面的内容.如果没有什么问题的话,我们就继续学习接下来的内容.当然,这还不是最麻烦的地方,因为今天我们只是介绍图的存储结构而已. 图的顺序存储结构:邻 ...
- 图的存储结构大赏------数据结构C语言(图)
图的存储结构大赏------数据结构C语言(图) 本次所讲的是常有的四种结构: 邻接矩阵 邻接表 十字链表 邻接多重表 邻接矩阵 概念 两个数组,一个表示顶点的信息,一个用来表示关联的关系. 如果是无 ...
- 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现
如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...
- 图的理解:深度优先和广度优先遍历及其 Java 实现
遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...
- 【PHP数据结构】图的遍历:深度优先与广度优先
在上一篇文章中,我们学习完了图的相关的存储结构,也就是 邻接矩阵 和 邻接表 .它们分别就代表了最典型的 顺序存储 和 链式存储 两种类型.既然数据结构有了,那么我们接下来当然就是学习对这些数据结构的 ...
- 图的深度优先和广度优先遍历(图以邻接表表示,由C++面向对象实现)
学习了图的深度优先和广度优先遍历,发现不管是教材还是网上,大都为C语言函数式实现,为了加深理解,我以C++面向对象的方式把图的深度优先和广度优先遍历重写了一遍. 废话不多说,直接上代码: #inclu ...
随机推荐
- (六)Jquery Mobile主题及插件的使用
二.自定义主题 根据js自带的主题,提取出来进行更改 来自为知笔记(Wiz)
- ios中操作技巧
1.配置字段快捷键: @property(nonatimic,copy) NSString *<#param#>; 2.NSNumber 转NSString 最快简单方式: NSNumbe ...
- mysql之SQL---存储过程
1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用 ...
- LPC1788系统时钟初始化
#ifndef __SYS_H_ #define __SYS_H_ #include "common.h" #define SystemCoreClock 120000000 ...
- UIAlertController高级之嵌入其他控件
在编码过程中,我们经常遇到需要这样一个效果,就是弹出框的嵌套; 举个最简单的例子,比如你要选择时间,必然需要一个时间选择器DatePicker.但是这个选择器又是在你点击某按钮时弹出,弹出方式最常见的 ...
- html 上传文件
1.html代码 <form id="form1" action="TestYield" method="post" enctype= ...
- 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密
在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...
- imagebutton、imageview的属性
[转]http://blog.csdn.net/victoryckl/article/details/14162131 http://blog.sina.com.cn/s/blog_68b3fdc30 ...
- js排序算法汇总
JS家的排序算法 十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n: 数据规模k:“桶”的个数In-place: 占用常数内存,不占用额外内存Out-place: 占用额外 ...
- sql server mdf碎片级数据库修复,数据库碎片级提取
sql server mdf碎片级数据库修复,数据库碎片级提取 大家都知道MDF数据库文件一般都比较大,在磁盘中往往被存放到不连续的逻辑簇中,久而久之就形成了文件碎片,当文件被误删除或者格式化后, ...