深度优先搜索

图的遍历

你。 提交于 2019-12-02 11:20:46
给出一个图G和其中任意一个顶点V 0 ,从V 0 出发系统的访问G中所有的顶点,每个顶点访问一次,这叫 图的遍历 。 深度优先搜索(depth-first search)简称DFS 基本思想 访问 一个顶点 V ,然后访问 该顶点邻接 到的 未被访问过的顶点V’ 再从V’出发递归地按照深度优先的方式遍历; 当遇到一个所有邻接于它多的顶点都被访问过了的顶点U时,则回到已访问顶点序列中最后一个未被访问的相邻顶点的顶点W; 在从W出发递归地按照深度优先的方式遍历 最后,当任何已被访问过的顶点都未被访问的相邻顶点时,则遍历结束。 深度优先搜索时间复杂度 对于具有 n个顶点 和 e条边 的无向图或有向图,深度优先搜索算法对图中 每一个顶点至多调用一次DFS 函数 用 邻接矩阵 表示图时,共需检查n 2 个矩阵元素,所需时间为 O(n 2 ) 用 邻接表 表示图时,找邻接点需将邻接表中所有边结点检查一遍,需要时间O(e),对应的深度优先搜索算法时间复杂度为 O(n+e) 。 深度优先搜索(breadth-first search)简称BFS 基本思想 访问顶点V 0 然后访问顶点V 0 邻接到的所有未被访问的顶点V 1 ,V 2 ,…,V i 再依次访问V 1 ,V 2 ,…,V i 邻接道德所有未被访问的顶点 如此进行下去,直到访问遍所有顶点 广度优先搜索时间复杂度 对于具有 n个顶点 和

树和图的深度优先搜索的模板框架

…衆ロ難τιáo~ 提交于 2019-12-01 21:18:48
#include<iostream> using namespace std; int N = 1e5 + 10,M = N*2; //h表示链表头,e存储的是所有的边,ne表示所有的next指针是多少,相当与n个单链表 int h[N],e[M],ne[M],idx; //深度优先搜索和宽度优先搜索每个点只会遍历一次 bool st[N];//存一下那些点已经被遍历过了,就不要再遍历他了 void add(int a,int b){//a前插入b e[idx] = b; ne[idx] = h[a]; h[a] = idx++; } //树和图的深度优先搜索的代码 时间复杂度是O(n + m),因为点数和边数呈线性关系 //u表示已经遍历到这个节点了 int dfs(int u){ st[u] = true;//首先先标记下当前这个点已经被搜索过了 //遍历下u的所有的初边 for(int i = h[u];i != -1;i = ne[i]){ // 存储当前结点对应图里边结点的编号是多少 int j = e[i]; //如果当前点没有做过的话,就一直搜,一条路走到黑 if(!st[j]) dfs(j); } } int main(){ //头结点指向-1,n给单链表的头结点指向-1 memset(h,-1,sizeof h); dfs(1);//从第一个点开始搜索 }   

深度优先搜索(DFS)和广度优先搜索(BFS)求解迷宫问题

白昼怎懂夜的黑 提交于 2019-12-01 17:19:53
用下面这个简单的迷宫图作为例子: OXXXXXXX OOOOOXXX XOXXOOOX XOXXOXXO XOXXXXXX XOXXOOOX XOOOOXOO XXXXXXXO O为通路,X为障碍物。 深度优先搜索就像是一条路走到黑,走到黑,黑了再回来。有种递归的感觉。 深度优先搜索(DFS) 1 #include<iostream> 2 using namespace std; 3 4 char a1[] = {'O','X','X','X','X','X','X','X','\0'}; 5 char a2[] = {'O','O','O','O','O','X','X','X','\0'}; 6 char a3[] = {'X','O','X','X','O','O','O','X','\0'}; 7 char a4[] = {'X','O','X','X','O','X','X','O','\0'}; 8 char a5[] = {'X','O','X','X','X','X','X','X','\0'}; 9 char a6[] = {'X','O','X','X','O','O','O','X','\0'}; 10 char a7[] = {'X','O','O','O','O','X','O','O','\0'}; 11 char a8[] = {'X','X','X'

深度优先搜索

懵懂的女人 提交于 2019-11-30 09:27:04
深度优先搜索(DFS, Depth First Search)是一个针对图和树的遍历算法。早在19世纪就被用于解决迷宫问题。 对于下面的树而言,DFS方法首先从根节点1开始,其搜索节点顺序是1,2,3,4,5,6,7,8(假定左分枝和右分枝中优先选择左分枝)。 DFS的实现方式相比于BFS应该说大同小异,只是把queue换成了stack而已,stack具有后进先出LIFO(Last Input First Output)的特性,DFS的操作步骤如下: 1、把起始点放入stack; 2、重复下述3步骤,直到stack为空为止: 从stack中访问栈顶的点; 找出与此点邻接的且尚未遍历的点,进行标记,然后全部放入stack中; 如果此点没有尚未遍历的邻接点,则将此点从stack中弹出。 下面结合一个图(graph)的实例,说明DFS的工作过程和原理: (1)将起始节点1放入栈stack中,标记为已遍历。 (2)从stack中访问栈顶的节点1,找出与节点1邻接的节点,有2,9两个节点,我们可以选择其中任何一个,选择规则可以人为设定,这里假设按照节点数字顺序由小到大选择,选中的是2,标记为已遍历,然后放入stack中。 (3)从stack中取出栈顶的节点2,找出与节点2邻接的节点,有1,3,5三个节点,节点1已遍历过,排除;3,5中按照预定的规则选中的是3,标记为已遍历

深度优先搜索与广度优先搜索

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-30 02:36:59
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/sunone_/article/details/83717938 广度优先搜索(宽度优先搜索,BFS)和深度优先搜索(DFS)算法的应用非常广泛,本篇文章主要介绍BFS与DFS的原理、实现和应用。 深度优先搜索 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。 显然,深度优先搜索是一个递归的过程。 下面进行说明: 第1步:访问A。 第2步:访问(A的邻接点)C。在第1步访问A之后,接下来应该访问的是A的邻接点,即"C,D,F"中的一个。但在本文的实现中,顶点ABCDEFG是按照顺序存储,C在"D和F"的前面,因此,先访问C。 第3步:访问(C的邻接点)B。在第2步访问C之后,接下来应该访问C的邻接点,即"B和D"中一个(A已经被访问过,就不算在内)。而由于B在D之前,先访问B。 第4步:访问

8.1 深度优先搜索(DFS)

半世苍凉 提交于 2019-11-29 13:28:44
2019年9月PAT - 练习笔记——8.1 以下页码标注的是阅读器中实际页码,而不是书本身自印的页码。 第8章 提高篇(2)——搜索专题 8.1 深度优先搜索(DFS) 注意 可以考虑对某些数据进行预处理,从而提高效率 目录 A1103 Integer Factorization A1103 Integer Factorization The K−P factorization of a positive integer N is to write N as the sum of the P-th power of K positive integers. You are supposed to write a program to find the K−P factorization of N for any positive integers N, K and P. Input Specification: Each input file contains one test case which gives in a line the three positive integers N (≤400), K (≤N) and P (1<P≤7). The numbers in a line are separated by a space. Output

DFS(深度优先搜索)

妖精的绣舞 提交于 2019-11-29 12:06:46
求有向图中的最短路径(JAVA+DFS算法实现) 问题描述 给定一个有向图,如下图所示,求从1号顶点到5号顶点的最短路径。 输入数据格式为第一行输入顶点数和边数,从第二行开始每一行输入3个整数,分别代表连接顶点的边和权重。 例如:1 2 2,表示从1号顶点到2号顶点连接的边,权重为2。 Input: 5 8 1 2 2 1 5 10 2 3 3 2 5 7 3 1 4 3 4 4 4 5 5 5 3 3 Output: 9 算法实现 package test2; import java.util.Scanner; public class dfstest { static int[][] edges=new int[100][100]; static int[] vertes=new int[100]; static int n,m,min=Integer.MAX_VALUE; static Scanner scanner=new Scanner(System.in); public static void main(String[] args) { // TODO Auto-generated method stub n=scanner.nextInt(); m=scanner.nextInt(); for (int i = 1; i <= n; i++) {//n个顶点 for

深度优先搜索

杀马特。学长 韩版系。学妹 提交于 2019-11-29 07:21:34
深度优先搜索也称深度寻路 规则:沿一个方向行走,走到了岔路口有选择一个方向进行前进 若碰到死胡同 退到上一个岔路口重新选择方向 走过的路不会再走 一次只能走一个点 1.准备地图(二维数组 用1表示障碍 不可通行 用0表示可以通行 1 #define MAP_ROW 10 2 #define MAP_COL 10 2.准备方向 1 enum Path_Dir{p_up,p_down,p_left,p_right}; 3.准备一个栈用来保存搜索中可以行走的路径点信息 1 #pragma one 2 template<typename T> 3 class CMyStack 4 { 5 T *pBuff; 6 size_t len; 7 size_t maxSize; 8 public: 9 CMyStack(); 10 ~CMyStack(); 11 void clear(); 12 public: 13 void push(T const& elem); 14 void pop(); 15 T const& getTop() const{ return pBuff[len - 1]; } 16 bool empty() const{ return len == 0; } 17 }; 18 19 template<typename T> 20 void CMyStack<T>::pop

深度优先搜索

流过昼夜 提交于 2019-11-29 07:21:32
深度优先搜索也称深度寻路 规则:沿一个方向行走,走到了岔路口有选择一个方向进行前进 若碰到死胡同 退到上一个岔路口重新选择方向 走过的路不会再走 一次只能走一个点 1.准备地图(二维数组 用1表示障碍 不可通行 用0表示可以通行 1 #define MAP_ROW 10 2 #define MAP_COL 10 2.准备方向 1 enum Path_Dir{p_up,p_down,p_left,p_right}; 3.准备一个栈用来保存搜索中可以行走的路径点信息 1 #pragma one 2 template<typename T> 3 class CMyStack 4 { 5 T *pBuff; 6 size_t len; 7 size_t maxSize; 8 public: 9 CMyStack(); 10 ~CMyStack(); 11 void clear(); 12 public: 13 void push(T const& elem); 14 void pop(); 15 T const& getTop() const{ return pBuff[len - 1]; } 16 bool empty() const{ return len == 0; } 17 }; 18 19 template<typename T> 20 void CMyStack<T>::pop

刷题 深度优先搜索(dfs)

一世执手 提交于 2019-11-29 06:29:14
文章目录 1. 相同树(leetcode 100) 2. 被围绕的区域(leetcode 130) 1. 相同树(leetcode 100) 给定两个二叉树,编写一个函数来检验它们是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 解题思路:最简单的思路即遍历每一个节点,指不相等返回false即可。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public : bool isSameTree ( TreeNode * p , TreeNode * q ) { if ( p == nullptr && q == nullptr ) return true ; if ( p == nullptr || q == nullptr ) return false ; if ( p -> val != q -> val ) return false ; return isSameTree ( p -> left , q -> left )