图论 之 BFS

文章目录

  • 3243.新增道路查询后的最短距离
  • 1311.获取你好友已观看的视频

BFS:广度优先搜索(BFS) 是一种常用的算法,通常用于解决图或树的遍历问题,尤其是寻找最短路径或层级遍历的场景。BFS 的核心思想是使用队列(FIFO 数据结构)来逐层遍历节点。

  • 模版
from collections import deque
# graph
def bfs(start):
    # 初始化队列,并将起始节点加入队列
    queue = deque([start])
    # 初始化 visited 集合,记录已访问的节点
    visited = set([start])
    while queue:
        # 从队列中取出当前节点
        node = queue.popleft()
        # 处理当前节点(例如打印、判断条件等)
        # 遍历当前节点的邻居
        for neighbor in graph[node]:
            if neighbor not in visited:
                # 将未访问的邻居加入队列,并标记为已访问
                queue.append(neighbor)
                visited.add(neighbor)

BFS求解最短距离:必要的条件是每条边的权值都是1

  • 最短距离的求解:分为求解start到end,以及start到剩余节点的问题
def bfs(start,end):
    queue = deque([start])
    # 可以记录是否访问过,还可以记录距离
    visited = {start:0}
    while queue:
        node = queue.popleft()
        if node == end:
            return visited[node]
            # friends是邻接表
        for neigh in friends[node]:
            if neigh not in visited:
                # 距离的更新
                visited[neigh] = visited[node] +  1
                queue.append(neigh)
  • 最短路径,求解start到其余节点的距离,区别在于删除了那个if node == end的判断
from collections import deque
# 这个friend是邻接表
def bfs(start):
    # 初始化队列,将起始节点加入队列
    queue = deque([start])
    # 记录每个节点是否被访问过以及从起始节点到该节点的最短距离
    # 初始时,起始节点的距离为 0
    visited = {start: 0}

    while queue:
        # 从队列中取出一个节点
        node = queue.popleft()
        # 遍历该节点的所有邻居节点
        for neigh in friends[node]:
            if neigh not in visited:
                # 如果邻居节点未被访问过,更新其距离为当前节点距离加 1
                visited[neigh] = visited[node] + 1
                # 将邻居节点加入队列,以便后续继续遍历其邻居
                queue.append(neigh)

    return visited

3243.新增道路查询后的最短距离

3243.新增道路查询后的最短距离

在这里插入图片描述

思路分析:

from collections import deque

class Solution:
    def shortestDistanceAfterQueries(self, n: int, queries: List[List[int]]) -> List[int]:
        # 初始化邻接表
        edge = [[] for _ in range(n)]
        for i in range(n - 1):
            edge[i].append(i + 1)  # 添加单向边

        # BFS 函数,计算从 start 到 end 的最短距离
        def bfs(start, end):
            queue = deque([start])
            visited = {start: 0}  # 记录每个节点的距离,也能记录是否被访问过
            while queue:
                node = queue.popleft()
                if node == end:
                    return visited[node]  # 返回最短距离
                for neigh in edge[node]:  # 遍历当前节点的邻居
                    if neigh not in visited:
                    # 注意的是这个距离的更新方式
                        visited[neigh] = visited[node] + 1  # 更新距离
                        queue.append(neigh)
            

        # 处理查询
        ans = []
        for p, q in queries:
            edge[p].append(q)  # 添加新边
            ans.append(bfs(0, n - 1))  # 计算最短距离
        return ans

1311.获取你好友已观看的视频

311.获取你好友已观看的视频

在这里插入图片描述

思路分析:

我的力扣题解

from collections import deque,defaultdict,Counter
class Solution:
    def watchedVideosByFriends(self, watchedVideos: List[List[str]], friends: List[List[int]], id: int, level: int) -> List[str]:
        # 首先我们只需记录你的朋友的级别!也就是最短距离,在最短距离的模版基础上修改即可
        # 后面再遍历即可
        # 难处在于什么都没有构建,不过这个friends就是相当于邻接表了

        # 我们只需计算start,end
        def bfs(start,end):
            queue = deque([start])
            visited = {start:0}

            while queue:
                node = queue.popleft()
                if node == end:
                    return visited[node]
                for neigh in friends[node]:
                    if neigh not in visited:
                        visited[neigh] = visited[node] +  1
                        queue.append(neigh)
        n = len(watchedVideos)
        video = []
        ans = []
        for i in range(n):
            if bfs(id,i) == level:
                video.extend(watchedVideos[i])
        
        # 去重吧
        ans = list(set(i for i in video))
        count = Counter(video)

        
        ans_sorted = sorted(ans, key=lambda x: (count[x], x))

        return ans_sorted

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VSCode集成deepseek使用介绍(Visual Studio Code)

VSCode集成deepseek使用介绍(Visual Studio Code) 1. 简介 随着AI辅助编程工具的快速发展,VSCode作为一款轻量级、高度可扩展的代码编辑器,已成为开发者首选的工具之一。DeepSeek作为AI模型,结合Roo Code插件&#x…

Qt中利用httplib调用https接口

httplib中如果要调用https接口,需要开启OPENSSL支持,经过半天坑爹得摸索,总结下经验。 1,下载 并安装Win64OpenSSL 地址如下,我Qt版本是5.15.2 ,openssl选择的是 64位(Win64OpenSSL-3_3_3.msi…

使用Geotools读取DEM地形数据实战-以湖南省30米数据为例

目录 前言 一、DEM地形数据介绍 1、DEM数据简介 2、DEM应用领域 3、QGIS中读取DEM数据 二、GeoTools解析地形 1、Maven中依赖引用 2、获取数据基本信息 三、总结 前言 随着全球数字化进程的加速,各类地理空间数据呈爆炸式增长,DEM 数据作为其中的…

登录-01.基础登录功能

一.需求分析 当前的页面不需要登录就可以进入,十分不安全,因此要设置登录功能来维护系统的安全性。登录时要根据输入的用户名和密码进行登录校验,如果在数据库中没有找到匹配的用户名和密码的话,那么就无法登录。 因此要先根据用…

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时,Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…

京东杀入外卖界,这波操作到底香不香?

京东杀入外卖界,这波操作到底香不香? 最近外卖圈炸了!京东这个电商巨头,居然一声不吭地搞起了外卖!一出手就是0佣金,品质堂食 两大杀招,直接把美团、饿了么整懵了。今天咱们就来唠唠&#xff0…

PTH 哈希传递攻击

参考文章:内网渗透 | 哈希传递攻击(Pass-the-Hash,PtH)-腾讯云开发者社区-腾讯云 哈希传递攻击(Pass-the-Hash,PtH)_c 实现 pass the hash功能-CSDN博客 域控机器账户:WIN-0V0GAORDC17 域控 ip:192.168.72.163 域内攻击者机器 ip&#xf…

Vue3项目,蛋糕商城系统

简单的vue3商城 蛋糕商城系统 下单平台 带用户 登录 注册 首页轮播图 购物车后台管理 商品订单 登录注册 商品详情 纯前端无后台、无数据库 纯Vue3项目作业 vue3 setup语法糖写法 技术实现 本项目主要使用如下技术实现, - 基于vue3vite搭建的项目框架 -…

快速上手gdb/cgdb

Linux调试器-gdb使用 1.背景2.调试原理、技巧命令2.1指令2.2 本质2.3 技巧 1.背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g…

LLM增强强化学习:开启智能决策的新篇章

标题期刊年份关键词Survey on Large Language Model-Enhanced Reinforcement Learning: Concept, Taxonomy, and MethodsIEEE Transactions on Neural Networks and Learning Systems2024Reinforcement learning (RL), large language models (LLM), vision-language models (V…

ECMAScript6------数组扩展

ECMAScript6------数组扩展 1.扩展运算符1.1 含义1.2 应用(1)复制数组(浅拷贝)(2)合并数组(3)与解构赋值结合(4)字符串(5)实现了Iterator接口的对象(6)Map和Set结构,Generator 函数 2.Array.from和Array.of(1)Array.from(2)Array.of 3.新增的实例方法(1)copyWithin()(2)find(回…

C++,设计模式,【工厂方法模式】

文章目录 如何用汽车生产线理解工厂方法模式?一、传统生产方式的困境二、工厂方法模式解决方案三、模式应用场景四、模式优势分析五、现实应用启示✅C++,设计模式,【目录篇】 如何用汽车生产线理解工厂方法模式? 某个早晨,某车企CEO看着会议室里堆积如面的新车订单皱起眉…

Web入侵实战分析-常见web攻击类应急处置实验2

场景说明 某天运维人员,发现运维的公司站点被黑页,首页标题被篡改,你获得的信息如下: 操作系统:windows server 2008 R2业务:公司官网网站架构:通过phpstudy运行apache mysqlphp开放端口&…

企业内部知识库:安全协作打造企业智慧运营基石

内容概要 作为企业智慧运营的核心载体,企业内部知识库通过结构化的信息聚合与动态化的知识流动,为组织提供了从数据沉淀到价值转化的系统性框架。其底层架构以权限管理为核心,依托数据加密技术构建多层级访问控制机制,确保敏感信…

第十二届先进制造技术与材料工程国际学术会议 (AMTME 2025)

重要信息 大会官网:www.amtme.org(了解会议,投稿等) 大会时间:2025年3月21-23日 大会地点:中国-广州 简介 2025年第十二届先进制造技术与材料工程 (AMTME 2025) 定于2025年3月21-23日在中国广州隆重举…

[展示]Webrtc NoiseSuppressor降噪模块嵌入式平台移植

最近在尝试把WebRtc的NoiseSuppressor模块移植到嵌入式平台,现在已经移植了,尝试了下效果,降噪效果很显著,噪声带被显著抑制了 降噪前: 降噪后:

禁止WPS强制打开PDF文件

原文网址:禁止WPS强制打开PDF文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何避免WPS强制打开PDF文件。 方法 1.删除注册表里.pdf的WPS绑定 WinR,输入:regedit,回车。找到:HKEY_CLASSES_ROOT\.pdf删除KWPS.PDF…

后端Java Stream数据流的使用=>代替for循环

API讲解 对比 示例代码对比 for循环遍历 package cn.ryanfan.platformback.service.impl;import cn.ryanfan.platformback.entity.Algorithm; import cn.ryanfan.platformback.entity.AlgorithmCategory; import cn.ryanfan.platformback.entity.DTO.AlgorithmInfoDTO; im…

JUC并发—8.并发安全集合一

大纲 1.JDK 1.7的HashMap的死循环与数据丢失 2.ConcurrentHashMap的并发安全 3.ConcurrentHashMap的设计介绍 4.ConcurrentHashMap的put操作流程 5.ConcurrentHashMap的Node数组初始化 6.ConcurrentHashMap对Hash冲突的处理 7.ConcurrentHashMap的并发扩容机制 8.Concu…

Java中的常用类 --String

学习目标 掌握String常用方法掌握StringBuilder、StringBuffer了解正则 1.String ● String是JDK中提前定义好的类型 其所在的包是java.lang ,String翻译过来表示字符串类型,也就是说String类中已经提前定义好了很多方法都是用来处理字符串的,所以Str…