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): #相等,则记录此时遍历的网格点数,如果小于记录的最小计数
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。