这里放一下关于图的遍历

废话少说直接上~~
首先是图的结构类型:

typedef struct ANode{int  adjvex;            //编号struct ANode *nextarc;  //链接指针Elemtype weight;        //权值
}ArcNode;typedef struct VNode{Elemtype data;          //头结点数据ArcNode *firstarc;      //指向第一个边结点
};typedef struct{VNode adjlist[MAX];int n;int e;
}ArcGraph;

图的创建(邻接链表):

void CreateAdj(ArcGraph *&G,int A[MAXV][MAXV],int n,int e){ArcNode *p;G=new ArcGraph;//为G申请储存空间for(int i=0;i<n;i++)//置空G->adjlist[i].firstarc=NULL;for(int i=0;i<n;i++)for(int j=n-1;j>=0;j--)if(A[i][j]!=0&&A[i][j]!=MAX)//如果邻接矩阵存在边{p = new ArcNode;//创建结点p->adjvex = j;//编号输入p->weight = A[i][j];//权值输入p->nextarc = G->adjlist[i].firstarc;//头插法插入G->adjlist[i].firstarc = p;}G->n=n;G->e=e;
}

po出两种算法

  • 深度遍历算法(递归)

递归深度遍历分这么几步
首先初始化访问数组=0
然后先将访问数组的访问顶点=1
接着该顶点的邻接点w
最后就开始循环递归的
while(w存在)
{
if(w未被访问)
递归
w转到下一个邻接点
}

int visitedDPS[MAX]={0};//全局标记数组
void DFS(ArcGraph *G,int v){ArcNode *p;visitedDPS[v]=1;//访问标记cout<<v<<" ";//输出访问编号p=G->adjlist[v].firstarc;//指向第一个顶点while (p!=NULL){if(visitedDPS[p->adjvex]==0)//如果访问标记为0DFS(G,p->adjvex);//递归调用p=p->nextarc;//指向下一个结点}
}
  • 广度优先遍历

首先还是初始化访问数组=0
然后访问顶点=1
将访问顶点的序号v加入队列queue
最后还是循环
while(queue为非空)
{
v=队列的头元素
w=v的第一个邻接点
while(w非空)
if(w的访问数组标记=0)
访问数组=1
w加入队列queue
w=顶点v的下一个邻接点

int visitedBFS[MAX]={0};//全局标记数组void BFS(ArcGraph *G,int v){ArcNode *p;queue<int>que;//初始化队列//int visited[MAX];for(int i=0;i<G->n;i++)visitedBFS[i]=0;//初始化标记数组cout<<v<<" ";//编号visitedBFS[v]=1;//访问标记que.push(v);//进队操作while (!que.empty()){/*在标记顶点序号的时候本以为p->adjvex就可以了  但是debug出现了segfault(原因尚未知)但是考虑到出顶点的时候利用队列的front函数得到那个序号就可以了!!*/int w=que.front();//这里真的是踩了一个大坑了!!!!que.pop();//顶点w点出队p = G->adjlist[w].firstarc;//指向w的第一个邻接点while (p != NULL) {if (visitedBFS[p->adjvex] == 0)//如果邻接点未被访问,访问该节点{cout << p->adjvex<< " " ;visitedBFS[p->adjvex] = 1;que.push(p->adjvex);//顶点进队}p = p->nextarc;//寻找下一个邻接点}}
}

这里主函数的调用

int main(){int A[5][5]={{ 0 , 8 ,MAX, 5 ,MAX},{MAX, 0 , 3 ,MAX,MAX},{MAX,MAX, 0 ,MAX, 6 },{MAX,MAX, 9 , 0 ,MAX},{MAX,MAX,MAX,MAX, 0 }};ArcGraph *G;int n=5,e=5;CreateAdj(G,A,n,e);cout<<"This is adjacency list which your created."<<endl;DispAdj(G);cout<<endl<<"This is Depth First Search."<<endl;DFS(G,0);cout<<endl<<"This is Breadth First Search."<<endl;BFS(G,0);return 0;
}

在深度优先遍历中使用了递归的方法,该算法的时间复杂度为O(n²),广度优先遍历中使用了标记数组的方法,该算法的时间复杂度为O(n+e),其中e为图中边的个数.对于空间复杂度来说,两者的储存类型都是一样的,所以空间复杂度是相同的.综合对比两个遍历算法,各有优点,而且遍历所得的结果不同,在实际使用的时候要考虑问题的实现方法来综合考量两种算法.

图的深度优先遍历与广度优先遍历及其复杂度分析相关推荐

  1. 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...

    图的深度优先遍历 题目:写出附从每个顶点出发的一次深度优先搜索遍历序列.在纸上画出遍历过程和序列,提交截图. 错误回答 从A点开始遍历:0124-01324-0134-0324-034 从B点开始遍历 ...

  2. 大话数据结构 17:图的深度优先遍历和广度优先遍历

    深度优先遍历 主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底-,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点 ...

  3. 图:图的邻接表创建、深度优先遍历和广度优先遍历代码实现

    邻接表介绍 邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构比较较浪费存储空间.如果不想浪费存储空间,大家肯定会先到链表.需要空间的时候再才想内存去申请,同样适用于图 ...

  4. 图:图的邻接矩阵创建、深度优先遍历和广度优先遍历详解

    邻接矩阵介绍 直接说,邻接矩阵是图的一种存储结构.那么图是什么呢?图是一种逻辑结构,和线性结构.树形结构.集合结构一样 是一种逻辑结构用来描述数据对象中的数据元素之间的关系.来看下图的定义:图(Gra ...

  5. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

  6. 多级树的深度优先遍历与广度优先遍历(Java实现)

    目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多 ...

  7. 数据结构—无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)

    无向图创建邻接矩阵.深度优先遍历和广度优先遍历 一.概念解析: (1)无向图: (2)邻接矩阵: 二.创建邻接矩阵: 三.深度遍历.广度遍历 (1)深度遍历概念: (2)广度遍历概念: 四.实例展示 ...

  8. 实现教材算法7.2利用邻接矩阵构造无向图的算法,在此基础上进行深度优先遍历和广度优先遍历。

    软件学院实验报告 姓名:              学号:              专业:               年级: 课程名称 数据结构 实验名称 实验9.图的遍历 实验的准备阶段 实验内 ...

  9. 二叉树深度优先遍历和广度优先遍历

    二叉树深度优先遍历和广度优先遍历

  10. 二叉树的深度优先遍历和广度优先遍历

    二叉树是一种很重要的数据结构,对于二叉树的遍历,有深度优先遍历和广度优先遍历,深度优先遍历又有先序.中序.后续遍历,广度优先遍历就是按层遍历. 1. 深度优先遍历 深度优先遍历,也就是先序.中序.后续 ...

最新文章

  1. html转jsp后空白页,netbeans 运行这个JSP 页面,结果是空白页。.
  2. 华为HCIA-Transmission H31-311练习题
  3. 腾讯助力贵阳市智慧升级 共同探索创新型城市发展
  4. 以“基”取胜:戴尔科技云平台 释放企业新动能
  5. 简单粗暴的移动端页面开发技能
  6. zookeeper的安装与配置(单机和集群)
  7. python如何监听cmd_如何从Python脚本捕获Python解释器和/或CMD.EXE的输出?
  8. Git 正在吞噬世界!
  9. Atitit  图像处理底色变红的解决
  10. python爬虫线上编辑_Python 爬虫入门《中》
  11. Cocos2d-x建工程时避免copy文件夹和库(子龙山人)
  12. 图片格式tif转换jpg
  13. 利用echart和echart-gl绘制江苏省的地图之二
  14. 阿里巴巴达摩院夺得首届“马栏山杯”国际音视频算法优化大赛【画质损伤修复赛道】冠军
  15. 开篮球馆需要什么_开一个篮球馆怎么样?开篮球馆需要办理什么手续?
  16. 微信小程序开发之——仿微信视频录制上传
  17. 【四二学堂】jquery方式ajax获取数据并渲染页面
  18. 题目 1339. 你的旅途由此开始
  19. socket read方法阻塞解决方法
  20. 移动游戏 真的吗???真的

热门文章

  1. redis主从,哨兵模式配置
  2. php mocking,php – Mocking Static Eloquent Models方法包括find()
  3. 2022年上海房地产研究报告
  4. 小说更新太慢怎么办_写网络小说写得太慢怎么办?
  5. html 调用es2015模块,ES 2015 Modules
  6. Ubuntu环境下XAMP安装PHP的rabbitmq扩展
  7. Bouncy Castle 密钥生成发放证书
  8. dcdc低压升压直流稳压高压负电压输出12v24v转-50V100V110V150V200V250V300V350V400V500V
  9. matlab动态图阿基米德螺旋,魔兽世界M基尔加丹阿基米德螺旋线之Matlab动图!国服加油...
  10. 2019百度之星初赛第五题