深度优先与广度优先算法

  图的遍历有深度优先和广度优先算法。

  深度优先遍历可描述为一个递归算法。当到达顶点v时,具体操作是:

  ①访问(v);

  ②for(与v相邻的每个顶点w) 遍历(w);

  

//深度优先算法
template<int max_size>
void Diagraph<max_size>::depth_first(void(*visit)(Vertex &)) const {
	bool visited[max_size]; //引入数组防止无限循环
	Vertex v;
	for (all v in G) visited[v] = false;
	for (all v in G) {
		if (!visited[v]) {
			traverse(v, visited, visit);
		}
	}
}
template<int max_size>
void Diagraph<max_size>::traverse(Vertex &v, bool visited[],
	void (*visit)(Vertex &)) const {
	Vertex w;
	visited[v] = true;
	(*visit)(v);
	for (all w adjacent to v) {
		if (!visited[w]) {
			traverse(w, visited, visit);
		}
	}
}

  广度优先算法借助队列,当访问v后, 将v相邻的仍未访问过的顶点加到队列后面,然后访问队列头:

//广度优先算法
template<int max_size>
void Diagraph<max_size>::breadth_first(void (*visit)(Vertex &)) const {
	Queue q;
	bool visited[max_size];
	Vertex v, w, x;
	for (all v in G) visited[v] = false;
	for (all v in G) {
		if (!visited[v]) {
			q.append(v);
			while (!q.empty()) {
				q.retrieve(w);
				if (!visited[w]) {
					visited[w] = true;
					(*visit) (w);
					for (all x adjacent to w) {
						q.append(x);
					}
				}
				q.serve();
			}
		}
	}
}

  可以使用深度优先遍历和广度优先遍历确定拓扑次序。

  深度优先遍历: 时间复杂度O(n+e)(n为图的定点数,e为图的边数)。

//深度优先算法
template<int graph_size>
void Diagraph<graph_size>:: depth_sort(List<Vertex>&topological_order) {
	bool visited[graph_size];
	Vertex v;
	for (v = 0; v < count; v++) visited[v] = false;
	topological_order.clear();
	for (v = 0; v < count; v++) {
		if (!visited[v]) {
			recursive_depth_sort(v, visited, topological_order);
		}
	}
}

template<int max_size>
void Diagraph<max_size>::recursive_depth_sort(Vertex v, bool *visited, List<Vertex>& topological_order) {
	visited[v] = true;
	int degree = neighbors[v].size();
	for (int i = 0; i < degree; i++) {
		Vertex w;
		neighbors[v].retrieve(i, w);
		if (!visited[w]) {
			recursive_depth_sort(w, visited, topological_order);
		}
	}
	topological_order.insert(0, v);
}
时间: 2024-10-03 02:43:09

深度优先与广度优先算法的相关文章

图的遍历方法(深度优先和广度优先算法)

图的遍历方法有两种: 1 深度优先 该算法类似于树的先根遍历: 2   广度优先 该算法类似树的层次遍历: 事例: 深度优先遍历顺序为:V1–V2–V4–V8–V5–V3–V6–V7 广度优先遍历顺序为:V1–V2–V3–V4–V5–V6–V7–V8 3   注意事项 1)一个图,它的深度优先和广度优先是不唯一的,可以有多个! 2)一般情况都是给邻接表或者邻接矩阵求深度优先和广度优先,此时,深度优先和广度优先都是唯一的了,因为当你的存储结构固定的时候,深度优先和广度优先也随之被固定了!

深度优先和广度优先算法

1.深度优先算法 遍历规则:不断地沿着顶点的深度方向遍历.顶点的深度方向是指它的邻接点方向. 最后得出的结果为:ABDECFHG. Python代码实现的伪代码如下: 2.广度优先算法: 遍历规则: 1)先访问完当前顶点的所有邻接点.(应该看得出广度的意思) 2)先访问顶点的邻接点先于后访问顶点的邻接点被访问. 最后得出的结果为:ABCDEFGH. Python代码实现的伪代码如下: 3.总结 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二

深度优先算法和广度优先算法

算法:深度优先算法和广度优先算法(基于邻接矩阵) 1.写在前面 图的存储结构有两种:一种是基于二维数组的邻接矩阵表示法. 另一种是基于链表的的邻接表. 在邻接矩阵中,可以如下表示顶点和边连接关系: 说明: 将顶点对应为下标,根据横纵坐标将矩阵中的某一位置值设为1,表示两个顶点向联接. 图示表示的是无向图的邻接矩阵,从中我们可以发现它们的分布关于斜对角线对称. 我们在下面将要讨论的是下图的两种遍历方法(基于矩阵的): 我们已经说明了我们要用到的是邻接矩阵表示法,那么我首先要来构造图: 矩阵图的数据

树图 广度优先算法和深度优先算法

原文链接: ????????深度优先算法:http://blog.163.com/zhoumhan_0351/blog/static/3995422720098342257387/ ????????广度优先算法:http://blog.163.com/zhoumhan_0351/blog/static/3995422720098711040303/ 树图 广度优先算法和深度优先算法

深度优先算法+广度优先算法

一 深度优先算法 bool visited[MaxVnum]; void DFS(Graph G,int v) { visited[v]= true; //从V开始访问,flag它 printf("%d",v); //打印出V for(int j=0;j<G.vexnum;j++) if(G.arcs[v][j]==1&&visited[j]== false) //这里可以获得V未访问过的邻接点 DFS(G,j); //递归调用,如果所有节点都被访问过,就回溯,而

树的深度优先与广度优先遍历

简述树的深度优先及广度优先遍历算法,并说明非递归实现. 原题出自百度的笔试: 当时我看到这个题目的时候,已经完全记不得非递归算法该怎么实现了,后来查阅了一下,要用到两个辅助的数据结构: 深度优先遍历--->栈: 广度优先遍历--->队列: 这里以二叉树为例来实现. import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode rig

爬了个爬(二)性能相关 及 深度优先与广度优先

性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): response = requests.get(url) return response url_list = ['http://www.github.com', 'http://www.bing.com'] for url in url_list: fetch_async(url) 1.同步执行

存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有结点,又有边,对于有权图来说,每条边上还带有权值.常用的图的存储结构主要有以下二种: 邻接矩阵 邻接表 邻接矩阵 我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法. 我们假设A是这个二维数组

Python爬虫从入门到放弃(十)之 关于深度优先和广度优先

网站的树结构 深度优先算法和实现 广度优先算法和实现 网站的树结构 通过伯乐在线网站为例子: 并且我们通过访问伯乐在线也是可以发现,我们从任何一个子页面其实都是可以返回到首页,所以当我们爬取页面的数据的时候就会涉及到去重的问题,我们需要将爬过的url记录下来,我们将上图进行更改 在爬虫系统中,待抓取URL队列是很重要的一部分,待抓取URL队列中的URL以什么样的顺序排队列也是一个很重要的问题,因为这涉及到先抓取哪个页面,后抓取哪个页面.而决定这些URL排列顺序的方法,叫做抓取策略.下面是常用的两