首页 > 编程语言 >代码随想录算法训练营第56天 | 广搜和深搜应用

代码随想录算法训练营第56天 | 广搜和深搜应用

时间:2024-08-01 15:40:07浏览次数:14  
标签:__ node graph 训练营 56 随想录 range visited main

110.字符串接龙
https://kamacoder.com/problempage.php?pid=1183
代码随想录
https://www.programmercarl.com/kamacoder/0110.字符串接龙.html#思路
105.有向图的完全可达性
https://kamacoder.com/problempage.php?pid=1177
代码随想录
https://www.programmercarl.com/kamacoder/0105.有向图的完全可达性.html
106.岛屿的周长
https://kamacoder.com/problempage.php?pid=1178
代码随想录
https://www.programmercarl.com/kamacoder/0106.岛屿的周长.html#思路

110.字符串接龙

  • step1:根据字符串建立图(邻接表);

  • step2:无向图求最短路径:广度优先搜索;

  • 广搜逻辑:

    • 一定要用队列:先进先出;
    点击查看代码
    from collections import deque
    
    def main():
    	dict_num = int(input())
    	source,target = input().split()
    	dict_str = [source]
    	for i in range(dict_num):
    		dict_str.append(input())
    	dict_str.append(target)
    	path_li = {}
    	for i in range(len(dict_str)):
    		path_li[i] = []
    		for j in range(len(dict_str)):
    			if i==j:
    				continue
    			if pre_distance(dict_str[i],dict_str[j])==1:
    				path_li[i].append(j)
    	res = bfs_path(path_li,0,dict_num+1)
    	print(res)
    
    def bfs_path(graph,start,end):
    	queue = deque([(start,[start])])
    	visited = set()
    	while queue:
    		node,path =  queue.popleft()
    		if node==end:
    			return len(path)
    		if node not in visited:
    			visited.add(node)
    			if len(graph[node])==0:
    				break
    				return 0
    			for neighbor in graph[node]:
    				if neighbor not in visited:
    					queue.append((neighbor,path+[neighbor]))
    	return []
    
    def pre_distance(str1,str2):
    	distance = 0
    	for i in range(len(str1)):
    		if str1[i]!=str2[i]:
    			distance+=1
    	return distance
    
    
    if __name__ == '__main__':
    	main()
    

105.有向图的完全可达性

  • 两种方式进行深搜:

    • 当前值执行;
    当前值执行
    def main():
    	n,k = map(int,input().split())
    	graph = {i:[] for i in range(n+1)}
    	for i in range(k):
    		s,t = map(int,input().split())
    		graph[s].append(t)
    	visited = [0]*(n+1)
    	dfs(graph,visited,1)
    	for i in range(1,n+1):
    		if visited[i]==0:
    			print("-1")
    			return
    	print("1")
    
    
    def dfs(graph,visited,node):
    	if visited[node]==1:
    		return
    	visited[node] =1
    	if len(graph[node])!=0:
    		for key in graph[node]:
    			dfs(graph,visited,key)
    
    if __name__ == '__main__':
    	main()
    
    • 处理过当前值循环;(和BFS的位置相同)
    处理过当前值循环
    from collections import deque
    def main():
    	n,k = map(int,input().split())
    	graph = {i:[] for i in range(n+1)}
    	for i in range(k):
    		s,t = map(int,input().split())
    		graph[s].append(t)
    	visited = [0]*(n+1)
    	visited[1] = 1
    	bfs(graph,visited,1)
    	for i in range(1,n+1):
    		if visited[i]==0:
    			print("-1")
    			return
    	print("1")
    
    def dfs(graph,visited,node):
    	visited[node] =1
    	if len(graph[node])!=0:
    		for key in graph[node]:
    			if visited[key]==0:
    				dfs(graph,visited,key)
    def bfs(graph,visited,node):
    	queue = deque([node])
    	while queue:
    		curr =queue.popleft()
    		for key in graph[curr]:
    			if visited[key]==0:
    				visited[key]=1
    				queue.append(key)
    
    if __name__ == '__main__':
    	main()
    

106. 岛屿的周长

  • 统计岛屿的周长;

  • 方法一:所有块的数量4-重合数量2

    点击查看代码
    def main():
    	n,m = map(int,input().split())
    	graph = [[0]*m for _ in range(n)]
    	for i in range(n):
    		data = input().split()
    		for j in range(m):
    			graph[i][j] = int(data[j])
    
    	directions = [[0,1],[0,-1]]
    	bound = 0
    	combine = 0
    	for i in range(n):
    		for j in range(m):
    			if graph[i][j]==1:
    				bound+=1
    				if i-1>=0 and graph[i-1][j]==1:
    					combine+=1
    				if j-1>=0 and graph[i][j-1]==1:
    					combine+=1
    	print(str(bound*4-combine*2))
    
    if __name__ == '__main__':
    	main()
    
  • 方法二:遇到了边缘块 统计边缘数量即可

    点击查看代码
    def main():
    	n,m = map(int,input().split())
    	graph = [[0]*m for _ in range(n)]
    	for i in range(n):
    		data = input().split()
    		for j in range(m):
    			graph[i][j] = int(data[j])
    
    	directions = [[0,1],[0,-1],[1,0],[-1,0]]
    	bound = 0
    	for i in range(n):
    		for j in range(m):
    			if graph[i][j]==1:
    				for dir_ in directions:
    					nextx = i+dir_[0]
    					nexty = j+dir_[1]
    					if nextx<0 or nextx>=len(graph) or nexty<0 or nexty>=len(graph[0]):
    						bound+=1
    					elif graph[nextx][nexty]==0:
    						bound+=1
    					else:
    						continue
    	print(bound)
    
    if __name__ == '__main__':
    	main()
    

标签:__,node,graph,训练营,56,随想录,range,visited,main
From: https://www.cnblogs.com/P201821440041/p/18336213

相关文章

  • 代码随想录算法训练营day01|704. 二分查找,27. 移除元素,977.有序数组的平方
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/description/本人代码:classSolution{public:intsearch(vector<int>&nums,inttarget){intlow=0,high=nums.size()-1;//此处分情况讨论returnsearchTarget(nums,low,high,tar......
  • 代码随想录day16 || 513 树左下角值,112 路径之和,116 中序后序遍历构造二叉树
    切片传递问题question:什么情况下传递切片,什么情况下传递切片指针,为什么有时候会修改原始副本,有时候又不会呢?typesli[]intfuncmain(){ slice:=[]int{1} fmt.Printf("slice:%p\n",slice) change1(slice) fmt.Println("=================================") s2:=......
  • 每日一题——A - Max/Min AtCoder - abc356_e
    1.题目大意:枚举两个数的Max/Min向下取整之和。2.思路:一开始并没有想时间复杂度问题发现通过sort()排序来遍历每个最小值Min和后面最大值的和就是题目答案。你会发现仍然有问题,那就是取整的问题你就必须要优化然后发现很明显超时了。现在我们来换一个角度思考。搭配前缀和嘛。为......
  • RK3568之修改8250驱动实现RS485收发的自动切换
    最近项目需求,要用到RK3568搭配自制底板。整个软硬件联调过程并不顺利,特立此系列帖,记录调试中发生的一些问题和解决办法。文章目录前言调试过程及问题解决办法1.硬件修改2.软件解决1.修改设备树文件2.查找设备树对应的串口驱动文件3.修改serial.h2.修改8250_dw.c2.修改......
  • 服务器LSI9361 RAID卡更换为BCM9560 RAID卡重启系统蓝屏解决方法
    一、问题现象服务器配LSI9361RAID卡,安装的系统为WindowsServer2022、2019、2016时。当LSI9361RAID卡故障后,使用BCM9560RAID卡替代后,无法进入系统后。报错提示如下图:二、解决方法 2.1 WindowsServer2022系统1、服务器启动时按F8键,选择“安全模式”进入系统。2......
  • 代码随想录Day1
    704.二分查找给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例2:......
  • # 代码随想录二刷(哈希表)
    代码随想录二刷(哈希表)三数之和思路反正对于我来说是真的难想出来。若这道题还是采用哈希表的思路去做,非常麻烦,并且还要考虑去重的操作。所以这道题其实用双指针,是更方便的。具体程序如下:classSolution:defthreeSum(self,nums:List[int])->List[List[int]]:......
  • 代码随想录算法训练营第55天 | 图论岛屿+水流
    孤岛的总面积https://kamacoder.com/problempage.php?pid=1173代码随想录https://www.programmercarl.com/kamacoder/0102.沉没孤岛.html102.沉没孤岛https://kamacoder.com/problempage.php?pid=1174代码随想录https://www.programmercarl.com/kamacoder/0102.沉没孤岛.......
  • 代码随想录 day 41 买卖股票的最佳时机系列
    买卖股票的最佳时机买卖股票的最佳时机解题思路使用动态规划的思路解决,这类题目和之前做到过的所有动态规划相比有一定变化。在确定数组方面,这系列的题目都使用了二维数组来表示买卖股票的不同状态。在递归方面,本系列和小偷,背包等问题不同,它的状态递推关系也不是需要前两种系列......
  • 代码随想录训练第三十天|01背包理论基础、01背包、LeetCode416.分割等和子集
    文章目录01背包理论基础01背包二维dp数组01背包一维dp数组(滚动数组)416.分割等和子集思路01背包理论基础背包问题的理论基础重中之重是01背包,一定要理解透!leetcode上没有纯01背包的问题,都是01背包应用方面的题目,也就是需要转化为01背包问题。所以我先通过纯01背......