图的遍历(一)—深度优先遍历

图就是由一些顶点和连接这些顶点的边组成的。

例如上图就是由5个顶点(1、2、3、4、5)和5条边(1-2、1-3、1-5、2-4、3-5)组成。

我们从1号顶点开始遍历这个图,遍历就是把图的每一个顶点都访问依次。

深度优先遍历的结果:

遍历顺序为:

深度优先遍历的思想:

首先以一个未被访问过的顶点作为起始顶点,沿着当前顶点的边走位未访问过的顶点;当没有未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。

沿着图的某一个分支遍历直到末端,然后回溯,再沿着另一条进行同样的遍历,直到所有的顶点都被访问过为止。

用邻接矩阵,二维数组e来存储一个图:

1表示有边,∞表示没有边,自己到自己为0.

无向图的邻接矩阵存储法。无向图指的就是图的边没有方向。无向图的邻接矩阵沿主对角线对称,无向图的特征。

代码如下:

输入:

运行结果:

深度优先遍历的应用——城市地图

有向图,有5个城市,8条公路,(a,b,c)表示从城市a到城市b的路程为c公里,求出1号城市到5号城市的最短路程。

邻接矩阵存储图,规则和上面一样:

从上图可以观察到一共有3条路径可从1->5:

1-2-3-4-5  长度14

1-2-5        长度9

1-5           长度10

输入数据:

运行结果:

时间: 2024-08-12 22:59:53

图的遍历(一)—深度优先遍历的相关文章

图的广度优先遍历和深度优先遍历

图是一种很重要的数据结构,在我们的编程生活中应用极其广泛 #include <iostream> using namespace std; #define INFINITY 32767 #define MAX_VEX 20 //最大顶点个数 #define QUEUE_SIZE (MAX_VEX+1) //队列长度 bool *visited; //访问标志数组 //图的邻接矩阵存储结构 typedef struct { char *vexs; //顶点向量 int arcs[MAX_VEX]

图的邻接表+深度优先遍历+广度优先遍历

1 /** 2 无向图的邻接表存储 3 深度优先遍历递归 4 广度优先遍历递归+非递归 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #include <malloc.h> 9 #define N 5 10 #define MAX 50 11 typedef struct A{ 12 int adjvex; 13 struct A* nextArc; 14 }Arc; 15 typedef struct node{

图的广度、深度优先遍历 C语言

以下是老师作为数据结构课的作业的要求,没有什么实际用处和可以探讨和总结的的地方,所以简单代码直接展示. 宽度优先遍历: 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 6 #define _clr(x, y) memset(x, y, sizeof(x)) 7 #define N 1010 8 9 int head[N], tot; 10 struc

python实现图广度优先遍历、深度优先遍历

一.广度优先遍历-bfs 顾名思义,bfs总是先访问完同一层的结点,然后才继续访问下一层结点,它最有用的性质是可以遍历一次就生成中心结点到所遍历结点的最短路径,这一点在求无权图的最短路径时非常有用.广度优先遍历的核心思想非常简单,用python实现起来也就十来行代码.下面就是超精简的实现,用来理解核心思想足够了: 1 import queue 2 3 def bfs(adj, start): 4 visited = set() 5 q = queue.Queue() 6 q.put(start)

广度优先遍历和深度优先遍历

对于二叉树,树的遍历通常有4种:先序遍历,中序遍历,后序遍历. 对于多叉树,树的遍历通常有2种,深度优先遍历和广度优先遍历 Dom的操作跟树的遍历天然的联系起来. 例如:上图所示的Dom树的关系可看出成一颗多叉树, 它的广度优先遍历(层次遍历)为: 深度优先遍历为:div .root  div .container  section .sidebar  ui.menu  section .mian  aritcle.post   p.copyright 例题: 利用深度优先遍历算法遍历出dom树

java实现图的遍历(深度优先遍历和广度优先遍历)

package arithmetic.graphTraveral;import java.util.LinkedList;import java.util.Queue; /** * 这个例子是图的遍历的两种方式 * 通过它,使我来理解图的遍历 * Created on 2013-11-18 * @version 0.1 */public class GraphTraveral{ // 邻接矩阵存储图 // --A B C D E F G H I // A 0 1 0 0 0 1 1 0 0 //

图的邻接表(广度优先遍历,深度优先遍历,最小生成树(Kruskal算法))

main.h: #include <iostream> #include <queue> #define DefaultSize 10 #define maxWeight -1 using namespace std; template<typename T,typename E> struct Edge { int dest; E cost; Edge<T,E> *link; Edge(int d=0,int c=0):dest(d),cost(c),li

算法-图的路径查询-深度优先遍历

#include <cassert> #include <vector> template<typename Graph> class Path { private: Graph &G; int s; //某一个点 bool* visited; int* from;//路径 void dfs(int v){ visited[v] = true; typename Graph::adjIterator adj(G,v); for(int i =adj.begin(

二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式

二叉树的遍历方式: 1.深度优先:递归,非递归实现方式 1)先序遍历:先访问根节点,再依次访问左子树和右子树 2)中序遍历:先访问左子树,再访问根节点吗,最后访问右子树 3)后序遍历:先访问左子树,再访问右子树,最后访问根节点 2.广度优先     按照树的深度,一层一层的访问树的节点 1 package Solution; 2 3 import java.util.LinkedList; 4 import java.util.Queue; 5 import java.util.Stack; 6

邻接矩阵的深度优先遍历

摘要:对<大话数据结构>P240——邻接矩阵的深度优先遍历,进行了自己的理解并完善了代码.Qt Creator测试通过. 举个简单的无序图例子,为了节省时间传手稿. 首先用邻接矩阵的存储结构创建该图,再进行深度优先遍历.代码和解释如下: #include <iostream> #include <stdlib.h> using namespace std; typedef struct//图的邻接矩阵存储结构 { char vexs[5]; int arc[5][5];