C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
来源:互联网 发布:知豆电动汽车价格图片 编辑:程序博客网 时间:2024/06/09 20:52
图的存储结构
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 0typedef 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;}
对于如下图这样的一个简单的图结构:
运行程序,结果如下:
0 0
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
- C语言实现图的邻接矩阵存储结构及深度优先遍历和广度优先遍历
- C语言以邻接矩阵为存储结构的图的构造以及广度优先,深度优先遍历
- 图的邻接矩阵存储 深度优先遍历 广度优先遍历 C语言实现
- 图:存储结构、深度优先遍历以及广度优先遍历
- 图的存储以及深度优先以及广度优先遍历
- 【图】图的邻接矩阵存储和广度、深度优先遍历
- 图的邻接矩阵存储:深度、广度优先遍历
- C++实现图的邻接矩阵的创建以及其深度优先遍历和广度优先遍历
- 图的深度优先遍历以及广度优先遍历
- 图的广度优先遍历(邻接矩阵)
- 图(邻接矩阵)的深度、广度优先遍历
- 图:广度深度优先遍历(邻接矩阵)
- 图(邻接矩阵存储)的广度优先遍历算法
- 图的邻接矩阵生成算法,深度优先遍历算法,广度优先遍历算法,Prime算法。):
- C语言以邻接表为存储结构的图的构造以及广度优先,深度优先遍历
- 邻接矩阵的深度优先遍历(递归以及非递归),广度优先遍历
- 邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
- Android xml资源文件中@、@android:type、@*、?、@+含义和区别
- 流水线技术
- NSMutableURLRequest 请求头的设置
- 创建和使用静态库 (C++)
- 黑马程序员_正则表达式
- C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)
- long time running down errors log ----ANR---android,sqlite
- iOS中的armv6、armv7、armv7s
- GetTickCount64不可靠
- DSP/BIOS的理解过程
- POJ 3608 求两凸包的最小距离 (凸包+旋转卡壳)
- gentoo安装的点点滴滴(六)
- MyBatis日志之Log4j示例——MyBatis学习笔记之十
- 新手SEO必备-百度快照回退或不更新的原因及解决办法