dfs和bfs遍历图的区别,dfs和bfs例题

  dfs和bfs遍历图的区别,dfs和bfs例题

  Python BFS和DFS算法看了哔哩哔哩的灯神视频,整理如下。最后,我想补充几个实际问题。

  

1.BFS

  bfs的全称是广度优先搜索,从任意一点开始,选择与其直接相关的(按顺序展开)来进行。主要由

队列

实现,直接如上图所示。两种检索算法都可以扫描所有图形。

  具体来说,用字典来表示图;直接用python list做队列就行了。

  Python代码:

  Graph={ A:[B , C], B:[A , C ], C:[A , B , D , e 可以动态添加或删除popqueue.append (s

  介绍BFS的几个扩展功能。

  BFS可以找到从一个点到所有其他点的所有路径。通过创建一个映射表(字典的数据结构),如果遍历过程中记录了最后一个点的位置,实际上会变成一个代码:parent[node]=vertex。

  在defBFS(graph,s): #s中,起点queue=[] # array是append,可以动态添加或删除popqueue.append(s) seen=[] #来保存缺失的seen节点。append parent={ s 3360 nont } for nodenodes 3360 ifnodetiseen:queue。append)节点)。=vertexprint(vertex) #打印当前获取的节点=None: #输出最短路径打印(v) v=parent[v]

2.DFS

  dfs的全称是深度优先搜索(depth-first search),从任意一点开始,走完路,知道无处可去后返回。在栈中实现时,代码基本和BFS一样,只是把BFS的队列改成栈,pop(0)是pop (pop),pop())表示删除最后一个元素。

  DEFDFS(graph,s): #s是起点stack=[] # array,表示追加,可以动态添加或删除popstack.append(s) seen=[] #保存缺失的节点seen . append(s)while(len)stack)最后一个元素nodes=ggen,弹出for node innodes 3360 ifnodetinsee:stack . append[node]seen . append[node]print[vertex]

  主题

  沿着图中的星号线切开,得到两个部分。每个部分的数字之和是60。

  关于这个问题的要求,请编程判断给定mn网格中的整数是否可以分成两部分,使这两个区域中的数字相等。

  如果有多个答案,请输出包含左上角网格的区域中包含的最小网格数。

  拆分时无法输出0。

  

输入格式

  首先,程序读入两个整数m ^ n,用空格(m,n10)除。

  指示表格的宽度和高度。

  接下来是N行,每行有M个正整数,用空格隔开。每个整数不超过10000。

  

输出格式

  输出一个整数,表示包含左上角的分区中可能包含的最小网格数。

  示例1

  3 3

  10 1 52

  20 30 1

  1 2 3

  示例1

  三

  点子:3359 www . Jian a9d 97

  先计算所有网格的总和,除以2得到极限值。遍历时,如果大于limit,则无需继续遍历。

回溯

;记录本次遍历的网格数,当小于记录的最小计数时更新;如果小于极限,则继续遍历。

  从左上角的框开始,深度优先遍历(dfs)可以通过使用递归很容易地执行。

  m,n=map(int,input)。split))lst=[]for I in range(n)n):#)输入m*n的个数,极限=int(all_sum/2) move=[[0,-1],[1,0],[0,1])y65:# beyond the grid boundary if(x0orx=len(lst)):returnfalse if(y0ory=len)lst[0])3360 returnfalse returnefty,visited): #visited是上述零矩阵全局移动#全局变量?下面是为什么全局变量globaleftgloballlimitglobalmin _ count left=lst[x][Y]=1 count=1 If(lefall llt)xmove[I][0],Y move[i][1])如果没有超出边界范围,则上下左右遍历if) visited[xmove][I][0],Y move如果访问的递归ifs (left==limit): #相等,则记录此时遍历的网格点数,如果小于记录的最小计数

dfs和bfs遍历图的区别,dfs和bfs例题