图有四种存储结构:数组,邻接表,十字链表,邻接多重表。下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历。其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含。具体代码如下:

//图的数组(邻接矩阵)存储表示和深度优先遍历const int MAX_VERTEX_NUM=20;  //最大顶点数
typedef enum {DG,DN,UDG,UDN} GraphKind ;//(有向图,有向网,无向图,无向网)
typedef int VRType;
typedef char InfoType;
typedef char VertexType;typedef struct ArcCell{VRType adj;  //VRType是顶点关系类型,对于无权图,用1或者0表示顶点相邻与否,对于有权图,则为权值类型InfoType  info;//该弧相关信息指针ArcCell(){adj=0;info=0;}
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct MGraph{VertexType vexs[MAX_VERTEX_NUM]; //顶点向量AdjMatrix arcs;  //邻接矩阵int vexnum,arcnum;  //图当前的顶点数和弧数GraphKind kind;  //图的种类标志
}MGraph;int LocateVex(MGraph G,char v1){for(int i=0;i<MAX_VERTEX_NUM;++i){if(G.vexs[i]==v1)return i;}return MAX_VERTEX_NUM+1;
}Status CreateUDN(MGraph &G){//采用数组(邻接矩阵)表示法,构建无向网G.kind=UDN;  //手动赋值为无向网int vexnumber=0,arcnumber=0;char info;cout<<"please input the vexnumber arcnumber and info:";cin>>vexnumber>>arcnumber>>info;G.vexnum=vexnumber;G.arcnum=arcnumber;for(int i=0;i<G.vexnum;++i){ //构造顶点向量cout<<"please input the vertex of number "<<i<<"(type char) ";cin>>G.vexs[i];}for(int i=0;i<G.vexnum;++i)  //初始化邻接矩阵for(int j=0;j<G.vexnum;++j){G.arcs[i][j].adj=0;G.arcs[i][j].info=0;}char v1,v2;int weight=0,i=0,j=0;char infomation;for(int k=0;k<G.arcnum;++k){  //初始化邻接矩阵cout<<"please input the two vertexs of the arc and it's weight "<<k+1<<" ";cin>>v1>>v2>>weight;i=LocateVex(G,v1);  j=LocateVex(G,v2);G.arcs[i][j].adj=weight;G.arcs[j][i].adj=weight;if(info!=48){//0的ascii码为48cout<<"please input infomation: ";cin>>infomation;G.arcs[i][j].info=infomation;G.arcs[j][i].info=infomation;}}return OK;
}void DisMGraph(MGraph m){for(int i=0;i<m.vexnum;++i){for(int j=0;j<m.vexnum;++j){cout<<m.arcs[i][j].adj<<" ";}cout<<endl;}
}//树的深度优先遍历和广度优先搜索遍历
bool visited[MAX_VERTEX_NUM] ;//访问标志数组Status VisitFunc(MGraph G,int v){ //函数变量if(G.vexs[v]){cout<<G.vexs[v]<<" ";return OK;}return ERROR;
}int FirstAdjVex(MGraph G,int v){  //返回图G中顶点V的第一个邻接点if(G.vexnum==0) return -1; //确定图G存在for(int j=0;j<G.vexnum;++j){if(G.arcs[v][j].adj)return j;}return -1;
}int NextAdjVex(MGraph G,int v,int w){  //返回顶点v的相对与w的下一个邻接点if(G.vexnum==0) return -1; //确定图G存在for(int j=w+1;j<G.vexnum;++j){if(G.arcs[v][j].adj)return j;}return -1;
}void DFS(MGraph G,int v){  //从第v个顶点出发,深度优先搜索遍历图Gvisited[v]=true; VisitFunc(G,v); //访问第v个结点for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)){if(!visited[w]) DFS(G,w); //对v的尚未访问的邻接顶点W递归调用DFS}
}void DFSTraverse(MGraph G,Status (*Visit)(MGraph G,int v)){//对图做深度优先遍历for(int v=0;v<G.vexnum;++v){  //访问标志数组初始化visited[v]=false;}for(int v=0;v<G.vexnum;++v){if(!visited[v]) DFS(G,v); //对尚未访问的结点调用DFS}
}void BFSTraverse(MGraph G,Status (*Visit)(MGraph G,int v)){//广度优先搜索遍历图for(int v=0;v<G.vexnum;++v) visited[v]=false;queue<char> que;char tempvex=0;for(int v=0;v<G.vexnum;++v){if(!visited[v]) {visited[v]=true; Visit(G,v);que.push(G.vexs[v]);while(!que.empty()){tempvex=que.front();que.pop();for(int w=FirstAdjVex(G,tempvex);w>=0;w=NextAdjVex(G,tempvex,w)){if(!visited[w]){visited[w]=true;Visit(G,w);que.push(G.vexs[w]);}}}}}
}
int main()
{MGraph m;CreateUDN(m);DisMGraph(m);cout<<"DFS result:";DFSTraverse(m,VisitFunc);cout<<endl<<"BFS result:";BFSTraverse(m,VisitFunc);return 0;
}

运行结果:

数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历相关推荐

  1. Python数据结构之树形结构——数组存储

    Python数据结构之树形结构--数组存储 树:一种非线性结构,主要使用链表来存储,也可以使用数组存储. 本代码使用两种数组 元素数组:0,6,3,5,4,7,8,9,2 由于 0 索引不存储元素,所 ...

  2. 深度优先搜索遍历与广度优先搜索遍历

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

  3. 7.连连看的数据结构与算法(数组存储和图的邻接矩阵存储)。

    存储连连看地图可以用数组存储,也可以用把地图当做图来处理,用邻接矩阵来存储. 下面展示这两种方法的区别: 初始化图中边的算法思想: 其中有使用typedef语句定义数组类型https://www.cn ...

  4. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

  5. 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS

    原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...

  6. 图的遍历:广度优先搜索(BFS)

    广度优先搜索(Breadth First Search) 广度优先搜索遍历类似于树的按层序遍历 第一个结点A入队,检查与结点A相连的结点B和结点F,结点A已经处理完,将结点A出队, 检查与结点B相连的 ...

  7. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  8. 无向图、深度优先搜索(无向图)、广度优先搜索(无向图)、无向图路径查找(基于深度优先搜索)

    一.无向图 1.1 图的相关术语 相邻顶点: 当两个顶点通过一条边相连时,我们称这两个顶点是相邻的,并且称这条边依附于这两个顶点. 度: 某个顶点的度就是依附于该顶点的边的个数. 子图: 是一幅图的所 ...

  9. 农夫过河游戏的几种处理方法(DFS深度优先搜索,BFS广度优先搜索)

    农夫过河游戏规则:在左岸有农夫.狼.羊.菜,农夫需要想办法将狼.羊.菜最终都带到右岸,条件就是农夫不在的时候,狼会吃羊,羊会吃菜,而且每次只能带一样,或者不带. 这里会用到堆栈.队列.列表这样的数据结 ...

最新文章

  1. SpringCloud Alibaba 微服务架构版本说明
  2. jvm 系列(九):如何优化 Java GC 「译」
  3. armv8/armv9的简介-学习这一篇就够了
  4. 【重复制造精讲】报告点(Reporting Point)简介
  5. 【渝粤题库】广东开放大学 网络营销基础与实践 形成性考核 (2)
  6. 前端学习(2874):原生js模块化+canvas绘制弹幕
  7. java xstream jar_Java库使用----xstream1.3.1
  8. 跨境网上收款 找PayPal没错(获取Client ID 和 secret)
  9. 程序员面试宝典问题及解析
  10. C++中利用输入输入流进行一行输入
  11. FydeOS for PC v6.0 发布,安卓子系统升级到 Pie
  12. typedef用法总结
  13. ubuntu freeradius mysql_ubuntu上安装和配置FreeRadius
  14. 关于认知(高效能人士的七个习惯,刻意练习,PDCA,GTD)
  15. GoJS 去水印方法
  16. BIP63(隐身地址)
  17. Mstar的Monitor方案笔记(七)——EDID基本数据结构
  18. sklearn 中的 make_blobs 的参数解释
  19. 48个英语音标练习-海伦英语视频
  20. 电池三段式充电 matlab,一种锂离子电池三段式充电方法与流程

热门文章

  1. 迭代与创新 - 不要指望一次成功
  2. 神经网络梯度消失和梯度爆炸及解决办法
  3. json schema多种形式_如何快速写出Json Schema,校验Json Schema
  4. php 小数点后6位,PHP保留小数点后几位的三种方法
  5. 分类决策树考虑了经验风险吗_分类决策树与去还是不去
  6. oracle中sql中文乱码,oracle中文字符乱码终极解决
  7. 深度学习:AI对抗学习比深度、增强学习能好多少
  8. google运行速度最近突然变慢了!!怎么回事!!!完美解决!!
  9. C语言实现旅馆信息管理系统
  10. Views - 收藏集 - 掘金