​​​​​​

目录

图的遍历

深度优先搜索法

广度优先搜索法

代码及注释部分


图的遍历,属于数据结构中的内容。指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历操作和树的遍历操作功能相似。图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上。

由于图结构本身的复杂性,所以图的遍历操作也较复杂,主要表现在以下四个方面:

① 在图结构中,没有一个“自然”的首结点,图中任意一个顶点都可作为第一个被访问的结点。

② 在非连通图中,从一个顶点出发,只能够访问它所在的连通分量上的所有顶点,因此,还需考虑如何选取下一个出发点以访问图中其余的连通分量。

③ 在图结构中,如果有回路存在,那么一个顶点被访问之后,有可能沿回路又回到该顶点。

④ 在图结构中,一个顶点可以和其它多个顶点相连,当这样的顶点访问过后,存在如何选取下一个要访问的顶点的问题。

图的遍历方法目前有深度优先搜索法和广度(宽度)优先搜索法两种算法。

深度优先搜索法

深度优先搜索法是树的先根遍历的推广,它的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,则退回到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点w,从w出发按同样的方法向前遍历,直到图中所有顶点都被访问。

广度优先搜索法

图的广度优先搜索是树的按层次遍历的推广,它的基本思想是:首先访问初始点vi,并将其标记为已访问过,接着访问vi的所有未被访问过的邻接点vi1,vi2,…, vi t,并均标记已访问过,然后再按照vi1,vi2,…, vi t的次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过,依次类推,直到图中所有和初始点vi有路径相通的顶点都被访问过为止。

代码及注释部分

本代码分为四个部分,第一部分先定义一个图结构,第二部分建立邻接表,第三部分dfs深度优先搜索算法,第四部分bfs广度优先搜索算法,第五部分为主程序部分,调用各个函数。

#include <iostream>
using namespace std;
const int MAX = 100;//顶点个数的最大值
//1、定义图的结构
typedef struct EdgeNode //弧节点结构
{int adjvex;//定义顶点域的位置struct EdgeNode *next;//指向下一条弧的指针
}*edgeptr;
typedef struct Vnode//顶点结点的结构
{int vertex;EdgeNode *link;//链域
}Adjlist[MAX];//最大100个
//2、定义邻接表
void build_adjlist(Adjlist& ga)
{int n, e, i, j;EdgeNode *p, *q;cout << "请输入顶点数:";cin >> n;//while (n<2)//{//cout << "请重新输入!" << endl;//cin >> n;//}for (int m = 1; m <= n; m++)//初始化邻接表{ga[m].vertex = m;ga[m].link = NULL;}cout << "请输入边数:";cin >> e;for (int k = 0; k<e; k++)//读入顶点对{cout << "读入顶点对:";cin >> i;cin >> j;p = new struct EdgeNode;p->adjvex = j;p->next = ga[i].link;ga[i].link = p;q = new struct EdgeNode;q->adjvex = i;q->next = ga[j].link;ga[j].link = q;}
}
//3、深度优先遍历:void dfs(Adjlist *g, int v0, int visited[])
void dfs(Adjlist g, int v0, int visited[])
{//从v0出发深度优先遍历图g,g以邻接表为储存结构cout << v0;visited[v0] = 1;//标志v0已访问EdgeNode *p;p = new EdgeNode;p = g[v0].link;while (p != NULL){if (visited[p->adjvex] == 0){dfs(g, p->adjvex, visited);}elsep = p->next;//回溯,找v0的下一个邻接点}
}//4、广度优先遍历:void bfs(Adjlist *g, int v0, int visited[])
void bfs(Adjlist g, int v0, int visited[])
{int Q[MAX];int v;int f, r;//f,r分别为队列的头尾指针visited[v0] = 1;cout << v0;EdgeNode *p;p = new EdgeNode;p = g[v0].link;f = r = 0;do{while (p != NULL){v = p->adjvex;if (visited[v] == 0)//若v未被访问,v入队 {r++;Q[r] = v;cout << v;visited[v] = 1;}p = p->next;//找某一个顶点的所有邻接点并进队}if (f != r){f++;v = Q[f];p = g[v].link;}} while ((p != NULL) && (f != r));
}
//5、主程序:
void main()
{Adjlist ga;build_adjlist(ga);int visited[MAX];for (int i = 1; i <= MAX; i++)visited[i] = 0;cout << "深度优先遍历:" << endl;dfs(ga, 1, visited);cout << endl;for ( i = 1; i <= MAX; i++)visited[i] = 0;cout << "广度优先遍历:" << endl;bfs(ga, 1, visited);cout << endl;system("pause");
}

#本小白初入行不久,代码习惯必定是缺陷很多,欢迎各位大佬指正。

算法:C++实现图的遍历相关推荐

  1. Python算法学习[5]—图、遍历、连通、最短路径代码演练

    图.遍历.连通.最短路径&代码演练 图是计算机科学中的一种数据结构,它由节点(顶点)和边组成.在实际应用中,图经常被用来表示复杂系统之间的关系,如社交网络.交通网络等.本文将介绍图的基本概念和 ...

  2. [算法学习no7]图的遍历

    图的遍历分为两种 1.深度优先搜索 2.广度优先搜索 图的遍历难度在于图有闭环,双向 所以一定不要迷路 因此,需要用数组标记访问过的结点即可 1.深度优先搜索 传入参数为结点 输出这个结点 标记这个结 ...

  3. 广度优先搜索c语言矩阵,算法7-6:图的遍历——广度优先搜索 (C++代码)

    解题思路: 首先要开一个二维数组储存邻接矩阵,一般的方法是开一个足够大的数组,例如这道题是n不大于50,不过这样做会造成空间不必要的浪费.因此手动分配空间会更为合理.一种方法是用malloc,对应销毁 ...

  4. 实验四 图的遍历算法设计与实现

    一.实验名称:图的遍历算法设计与实现 二.实验目的: 1.掌握图的深度优先遍历的算法. 2.掌握图的广度优先遍历的算法. 3.实验章节:算法设计与分析 第四章 三.实验内容.实验问题和程序运行结果 第 ...

  5. 图的遍历算法【数据结构F】

    图的遍历算法有哪两种? 深度优先调度算法---------将图结构看成是树形结构,树形结构的子图直接是没有交叉的,但是对于图结构的树形结构之间是有交叉的,类比于树形结构的二叉树,左指数和右指数都会相应 ...

  6. 图论算法——图的遍历

    图论算法也是非常基础且重要的算法(ps:好像没有不重要的......) 图的基本应用--图的遍历,从具体的题目着手,学习图的遍历方式及代码形式. 我们先来看一下题目,然后再具体分析图的遍历方式. 题目 ...

  7. c语言遍历算法的头文件,图优先遍历算法(C语言版).doc

    图优先遍历算法(C语言版) 众炼向饭桨泞奉源柿虐萧宰徽强药邻摘甭膜酣猖椅支习洋瞪较效笋盏厚婪跳博险僳乘措笆却问谬闸皇机兽偿谐芹违邹竞芬襟竣备烘令救汇邵叙鹰扭肾钙苏辅捕先是埠郧苛三驯溅烂右井准刮修柒拿苇 ...

  8. 【小算法】图的遍历之深度优先(DFS)

    谈到算法,图的操作是避免不了. 而我们一般谈到图时,又必定会谈到图的遍历. 图的遍历通常有 2 种,深度优先(DFS) 和广度优先(BFS). 本篇博文讲解深度优先(DFS). 图的表示 图有两种表示 ...

  9. Java数据结构与算法:无向图,有向图,带权图,图的遍历,最小生成树

    文章目录 无向图 有向图 带权图 图的遍历 广度优先遍历 深度优先遍历 最小生成树 无向图 前面了解到树是有单一根结点的非线性结构,图(graph)也是一种非线性结构,其中的结点可以与许多其他的结点相 ...

  10. 图的遍历(搜索)算法 之 深度优先遍历算法

    图的遍历的定义: 从图中的某个顶点出发访问遍图中的所有顶点,并且每个顶点仅仅被访问一次. 图的遍历算法我们常见的而且用的最多的就有两种:其一是图的深度优先遍历算法:其二是图的广度优先遍历算法.这里我们 ...

最新文章

  1. R可视化在回归曲线中添加回归方程式
  2. noip2016前的话[漫谈]
  3. rpm卸载mysql和php_CentOS 6.5 卸载mysql和php
  4. Linux使用dd命令快速生成大文件
  5. Mustache 中的html转义问题处理
  6. 熊猫直播P2P分享率优化(下):ASN组网
  7. MOSS站点的FORM认证修改小结
  8. 求无序序列每个元素最接近的值
  9. fgets,cin. getline被跳过
  10. Codeforces Round #302 (Div. 2)
  11. Linux常用命令之yum
  12. Google的Guava开发库快速快速入门
  13. php求二叉树的深度(1、二叉树就可以递归,因为结构和子结构太相似)(2、谋而后动,算法想清楚,很好过的)...
  14. 常规WebRoot项目在Idea中通过tomcat运行
  15. Ubuntu 下五笔拼音混合输入法
  16. PHP玄帧道长,青龙道长率众弟子朝真“凝真宫”
  17. 盘点CSV文件在Excel中打开后乱码问题的两种处理方法
  18. activemq-messages-dequeud-but-not-consumed
  19. STC51从入门到精通(汇编)~~~ 第一讲:概述
  20. DARTS 可微 架构搜索

热门文章

  1. VOC数据集介绍及标签制作软件labelImg的使用
  2. debian安装thunderbird
  3. python--读取TRMM-3B43月平均降水绘制气候态空间分布图(陆地区域做掩膜)
  4. 转载:运用MQTT-JMeter插件测试MQTT服务器性能
  5. java 判断一个对象是否为空对象
  6. 一个集合了497个AI工具的人工智能网站
  7. 一款Android图片预览的开源库,几乎百分百还原微信的图片预览。
  8. IE被恶意修改,怎么办?
  9. 江苏省教育网计算机二级,江苏省计算机二级考试时间 考试形式
  10. htc自带的位置服务器,htc手机自带的云服务器