图的广度优先遍历和深度优先遍历
图是一种很重要的数据结构,在我们的编程生活中应用极其广泛
1 #include <iostream> 2 using namespace std; 3 #define INFINITY 32767 4 #define MAX_VEX 20 //最大顶点个数 5 #define QUEUE_SIZE (MAX_VEX+1) //队列长度 6 7 bool *visited; //访问标志数组 8 //图的邻接矩阵存储结构 9 typedef struct 10 { 11 char *vexs; //顶点向量 12 int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵 13 int vexnum,arcnum; //图的当前顶点数和弧数 14 }Graph; 15 //队列类 16 class Queue{ 17 public: 18 void InitQueue() 19 { 20 base=(int *)malloc(QUEUE_SIZE*sizeof(int)); 21 front=rear=0; 22 } 23 void EnQueue(int e) 24 { 25 base[rear]=e; 26 rear=(rear+1)%QUEUE_SIZE; 27 } 28 void DeQueue(int &e) 29 { 30 e=base[front]; 31 front=(front+1)%QUEUE_SIZE; 32 } 33 public: 34 int *base; 35 int front; 36 int rear; 37 }; 38 39 40 //图G中查找元素c的位置 41 int Locate(Graph G,char c) 42 { 43 for(int i=0;i<G.vexnum;i++) 44 if(G.vexs[i]==c) 45 return i; 46 return -1; 47 } 48 49 50 //创建无向网 51 void CreateUDN(Graph &G) 52 { 53 int i,j,w,s1,s2; 54 char a,b,temp; 55 cout<<"输入顶点数和弧数:"; 56 cin>>G.vexnum>>G.arcnum; 57 G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配顶点数目 58 cout<<"输入"<<G.vexnum<<"个顶点."<<endl; 59 for(i=0;i<G.vexnum;i++) 60 { 61 //初始化顶点 62 cout<<"输入顶点"<<i+1<<":"; 63 cin>>G.vexs[i]; 64 } 65 for(i=0;i<G.vexnum;i++) //初始化邻接矩阵 66 for(j=0;j<G.vexnum;j++) 67 G.arcs[i][j]=INFINITY; 68 cout<<"输入"<<G.arcnum<<"条弧."<<endl; 69 for(i=0;i<G.arcnum;i++) 70 { 71 //初始化弧 72 cout<<"输入弧"<<i+1<<":"; 73 cin>>a>>b>>w; //输入一条边依附的顶点和权值 74 s1=Locate(G,a); 75 s2=Locate(G,b); 76 G.arcs[s1][s2]=G.arcs[s2][s1]=w; 77 } 78 } 79 80 81 //图G中顶点k的第一个邻接顶点 82 int FirstVex(Graph G,int k) 83 { 84 if(k>=0 && k<G.vexnum) 85 { 86 //k合理 87 for(int i=0;i<G.vexnum;i++) 88 if(G.arcs[k][i]!=INFINITY) 89 return i; 90 } 91 return -1; 92 } 93 94 95 //图G中顶点i的第j个邻接顶点的下一个邻接顶点 96 int NextVex(Graph G,int i,int j) 97 { 98 if(i>=0 && i<G.vexnum && j>=0 && j<G.vexnum) 99 { 100 //i,j合理 101 for(int k=j+1;k<G.vexnum;k++) 102 if(G.arcs[i][k]!=INFINITY) 103 return k; 104 } 105 return -1; 106 } 107 108 109 //深度优先遍历 110 void DFS(Graph G,int k) 111 { 112 int i; 113 if(k==-1) 114 { 115 //第一次执行DFS时,k为-1 116 for(i=0;i<G.vexnum;i++) 117 if(!visited[i]) 118 DFS(G,i); //对尚未访问的顶点调用DFS 119 } 120 else 121 { 122 visited[k]=true; 123 cout<<G.vexs[k]; //访问第k个顶点 124 for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i)) 125 if(!visited[i]) 126 DFS(G,i); //对k的尚未访问的邻接顶点i递归调用DFS 127 } 128 } 129 130 131 //广度优先遍历 132 void BFS(Graph G){ 133 int k; 134 Queue Q; //辅助队列Q 135 Q.InitQueue(); 136 for(int i=0;i<G.vexnum;i++) 137 if(!visited[i]) 138 { 139 //i尚未访问 140 visited[i]=true; 141 cout<<G.vexs[i]; 142 Q.EnQueue(i); //i入列 143 while(Q.front!=Q.rear) 144 { 145 Q.DeQueue(k); //队头元素出列并置为k 146 for(int w=FirstVex(G,k);w>=0;w=NextVex(G,k,w)) 147 if(!visited[w]) 148 { 149 //w为k的尚未访问的邻接顶点 150 visited[w]=true; 151 cout<<G.vexs[w]; 152 Q.EnQueue(w); 153 } 154 } 155 } 156 } 157 158 159 //主函数 160 int main() 161 { 162 int i; 163 Graph G; 164 CreateUDN(G); 165 visited=(bool *)malloc(G.vexnum*sizeof(bool)); 166 cout<<"深度优先遍历: "; 167 for(i=0;i<G.vexnum;i++) 168 visited[i]=false; 169 DFS(G,-1); 170 cout<<"\n广度优先遍历: "; 171 for(i=0;i<G.vexnum;i++) 172 visited[i]=false; 173 BFS(G); 174 system("pause"); 175 return 0; 176 }
转载于:https://www.cnblogs.com/Amedeo/p/6139116.html
图的广度优先遍历和深度优先遍历相关推荐
- 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)
目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...
- 图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现
遍历的定义: 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算. 一:深度优先遍历(DFS) 1,在访问图中某一起始顶点V后,由V ...
- python 遍历_python实现图广度优先遍历、深度优先遍历
一.广度优先遍历-BFS 顾名思义,BFS总是先访问完同一层的结点,然后才继续访问下一层结点,它最有用的性质是可以遍历一次就生成中心结点到所遍历结点的最短路径,这一点在求无权图的最短路径时非常有用.广 ...
- 数据结构之图的遍历:深度优先遍历(DFS)
图的遍历:深度优先遍历 思维导图: 深度优先遍历的原理: 深度优先遍历的代码实现: 深度优先遍历的性能: 深度优先生成树: 遍历与连通性的关系: 思维导图: 深度优先遍历的原理: ps: 实现方法是递 ...
- 【数据结构】图-图的遍历_深度优先遍历(动态图解、c++、java)
文章目录 一.概述 二.深度优先搜索 算法步骤 递归 非递归 图解 BFS树 代码 邻接矩阵实现 邻接表实现 链式前向星实现 三.完整代码 邻接矩阵版 邻接表版 链式前向星版 四.总结 算法复杂度分析 ...
- java队列遍历多叉树_多叉树的设计、建立、层次优先遍历和深度优先遍历.pdf
多叉树的设计.建立.层次优先遍历和深度优先遍历 钦 锑 垂 辈 戏 拜 屡 枫 株 冠 镁 障 窘 填 夯 踞 猎 付 管 泽 浓 蚊 涟 瞬 麓 屠 骋 魏 纱 届 糯 孕 永 各 尔 驴 颐 橙 ...
- java 图的邻接矩阵表示,深度优先遍历,广度优先遍历
转载:http://blog.csdn.net/yxmmao/article/details/51586540 1 . 创建图的邻接矩阵数据结构 public class MGraph {/*图的邻接 ...
- 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解
邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...
- 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
一.图的表示 图G=(V,E).要表示一个图,通常有两种方法:邻接表和邻接矩阵.两种方法都既可以表示有向图,也可以表示无向图. 邻接表表示由一个包含|V|个列表的数组组成,其中每个列表对应V中的一个顶 ...
最新文章
- 解决安装XMind出现Invalid Configuration Location The configuration area at ‘C:\Users\Administrator\Applicat
- 图的最小生成树和最短路径算法思路总结(Prim,Kruskal,Dijkstra,Floyd)
- 【二分】数列分段(ybtoj 二分-1-1)
- 前端学习(2864):简单秒杀系统学习之优化js
- Android中Activity启动模式
- 技术实践第三期|HashTag在Redis集群环境下的使用
- FFT分析的加窗和重叠
- UVa 10986 - Sending email
- std::function
- 文华财经期货买卖点指标源码,期货超短线指标公式源码
- 20201125 plecs更新
- 100以内的平方数记忆法
- MATLAB中round函数的使用
- 力扣刷题笔记:1438. 绝对差不超过限制的最长连续子数组(滑窗模板题,选择有序列表SortedList()数据类型就不会超时)
- tplink打印机服务器重置,TP-Link无线路由器打印机设置指南
- 洲际酒店集团加速布局粤港澳大湾区,与华侨城酒店集团达成合作
- 360n4s普通版Android7,360手机N4S骁龙版是什么意思 360N4S骁龙版与普通版的区别有哪些...
- Java解析Google Maps API返回的Json
- 使用 Istio 实现基于 Kubernetes 的微服务应用
- oracle ogg在线配置,Oracle OGG配置
热门文章
- 20135316王剑桥 linux第六周课实验笔记
- oracle关键字 bulk,oracle和sqlserver的一些保留关键字
- java中遍历collection_使用Java中的Iterator遍历Collection
- mac系统升级 brew 是用不了_Mac 终端(terminal) oh-my-zsh+solarized配置
- 目录:关于【稳定性建设之道】大纲速览
- MAC OS安装Composer + Laravel
- RocketMQ(八)——Rebalance机制介绍
- Python模板设置
- ios项目中使用gcd的场景_Redis在PHP项目中的实际应用场景
- mysql自增长id为null_主键设为自增字段了, 在添加数据时经常报null id是怎么回事?...