[Leetcode] 传递信息(有向图路径)

news2024/11/20 15:16:15

小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:

有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0

每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的。每轮信息必须需要传递给另一个人,且信息可重复经过同一个人。

给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小伙伴处的方案数;若不能到达,返回 0。

示例 1:
输入:n = 5, relation = [[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]], k = 3
输出:3
解释:信息从小 A 编号 0 处开始,经 3 轮传递,到达编号 4。共有 3 种方案,分别是 0->2->0->4, 0->2->1->4, 0->2->3->4。

示例 2:
输入:n = 3, relation = [[0,2],[2,1]], k = 2
输出:0
解释:信息不能从小 A 处经过 2 轮传递到编号 2

限制:
2 <= n <= 10
1 <= k <= 5
1 <= relation.length <= 90, 且 relation[i].length == 2
0 <= relation[i][0],relation[i][1] < n 且 relation[i][0] != relation[i][1]

题目链接:https://leetcode.cn/problems/chuan-di-xin-xi/

参考题解链接:https://leetcode.cn/problems/chuan-di-xin-xi/solution/chuan-di-xin-xi-by-leetcode-solution/

可以通过深度优先搜索、广度优先搜索或动态规划实现

    • 深度优先搜索

从节点 0 出发做深度优先搜索,每一步记录当前所在的节点以及经过的轮数,当经过 k 轮时,如果位于节点 n-1,则将方案数加 1。搜索结束后可得到总的方案数。

class Solution:
    def numWays(self, n: int, relation: List[List[int]], k: int) -> int:
        # 将 某节点-该节点能到达的节点列表 存成字典
        edges = collections.defaultdict(list)
        for src, dst in relation:
            edges[src].append(dst)
        
        ways = 0
        #深度优先搜索方法,参数 到达的节点node,经过了多少步 steps
        def dfs(node, steps):
            #如果步数为k,判断所在节点是否为n-1,是则所求路径数加一
            if steps == k:
                if node == n - 1:
                    nonlocal ways
                    ways += 1
                return
            for nextNode in edges[node]:
                dfs(nextNode,steps+1)

        #从节点 0 出发做深度优先搜索      
        dfs(0,0)
        return ways 

上述深度优先搜索作为内部函数,也可以拿出来作为一个方法,如下,

class Solution:
    def numWays(self, n: int, relation: List[List[int]], k: int) -> int:
        self.ways , self.n, self.k = 0, n, k
        # 将 某节点-该节点能到达的节点列表 存成字典
        self.edges = collections.defaultdict(list)
        for src, dst in relation:
            self.edges[src].append(dst)

        #从节点 0 出发做深度优先搜索
        self.dfs(0,0)
        return self.ways 

    #深度优先搜索方法,参数 到达的节点node,经过了多少步 steps
    def dfs(self, node, steps):
        #如果步数为k,判断所在节点是否为n-1,是则所求路径数加一
        if steps == self.k:
            if node == self.n - 1:
                self.ways += 1
            return
        for nextNode in self.edges[node]:
            self.dfs(nextNode,steps+1)

2. 广度优先搜索

从节点 0 出发做广度优先搜索,当遍历到 k层时,如果位于节点 n-1,则将方案数加 1。

class Solution:
    def numWays(self, n: int, relation: List[List[int]], k: int) -> int:
        # 将 某节点-该节点能到达的节点列表 存成字典
        edges = collections.defaultdict(list)
        for src, dst in relation:
            edges[src].append(dst)
        steps = 0
        ways = 0
        # 初始化一个队列,该队列里只有初始节点0
        queue = collections.deque([0])

        # 当走的步数小于k时/遍历的层数小于k时,把每层的节点逐个拎出来,再用一层循环找到每个节点的所有可能的下一个节点,append到队列,做完这个操作相当于往前走了一步(层),steps 加一
        while queue and steps < k:
            for i in range(len(queue)):
                node = queue.popleft()

                for nextNode in edges[node]:
                    queue.append(nextNode)
                
            steps += 1
        #遍历到第k层,即走了k步,不满足上述循环条件,此时steps为 k,queue中是第k层的目标节点,即全部路径走到第k步所在的节点
        if steps == k:
            for node in queue:
                #如果此时所在的节点是n-1,所求路径数加一
                if node == n-1:
                    ways += 1
        return ways
            

3. 动态规划

定义动态规划的状态 dp[i][j] 为经过 i 轮传递到节点 j 的方案数,其中 0<=i<=k,0<=j<=n-1。

如果第 i 轮传递到编号 src 的玩家,则第 i+1 轮可以从编号 src 的玩家传递到编号 dst 的玩家。

动态规划的状态转移方程:

class Solution:
    def numWays(self, n: int, relation: List[List[int]], k: int) -> int:
        #初始化一个k+1行,n列的二维数组
        dp = [[0] * n for _ in range(k + 1)]

        #当 i=0时,一定位于编号 0的玩家,j!=0 时,dp[0][j] = 0 ,保持初始化的0即可
        dp[0][0] = 1
        for i in range(k):
            for src,dst in relation:
                dp[i + 1][dst] += dp[i][src]
        # 返回经过 k 轮传递到节点 n-1 的方案数
        return dp[k][n - 1]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python数据分析之Pandas

文章目录前言一、输入输出1.1 txt1.2 csv1.3 excel1.4 json1.5 sql1.6 html1.7 latex二、数据结构2.1 一维数据 Series2.2 二维数据 DataFrame2.2.1 数据查看2.2.2 数据遍历2.2.3 数据选取2.2.4 数据处理2.2.5 数据统计2.3 索引对象 Index2.4 时间戳 TimeStamp三、窗口函数3.1 …

【每日一题】【LeetCode】【第十天】只出现一次的数字

解决之路 题目描述 测试案例&#xff08;部分&#xff09; 第一次 和昨天的题目有点类似&#xff0c;昨天是找重复&#xff0c;今天是找不重复。那直接按昨天第二次思路来写这次的代码。 class Solution(object):def singleNumber(self, nums):nums.sort()for i in range(l…

在线计算lncRNA-mRNA共表达相关系数,并使用cytoscape绘制共表达网络图

长链非编码RNA(Long noncoding RNA)是一类长度大于200 nt&#xff0c;不编码蛋白质的RNA。LncRNA的功能多样&#xff0c;如图1所示&#xff0c;A&#xff1a;充当蛋白质和染色质的连接因子&#xff0c;引起染色质重构&#xff08;chromatin remodeling&#xff09;&#xff1b;…

内存函数细节及实现

1、memcpy内存拷贝 不仅可以拷贝&#xff0c;还可以拷贝整型、结构体等&#xff0c;因为直接拷贝了内存。 因为不知道要拷贝的类型是什么&#xff0c;所以都用void*来接收。num是拷贝的字节数 拷贝时可任意选择dest&#xff0c;src&#xff0c;以及字节数。返回void*类型的指…

01什么是FPGA?

FPGA 是一种硬件可重构的体系结构。它的英文全称是Field Programmable Gate Array&#xff0c;中文名是现场可编程门阵列。 FPGA就是一个可以通过编程来改变内部结构的芯片&#xff0c;FPGA常年来被用作专用芯片&#xff08;ASIC&#xff09;的小批量替代品&#xff0c; 同时也…

PMP考试流程是怎么样的?

别的问题我可能不太了解&#xff0c;但考试流程我绝对是非常清楚了&#xff01;话不多说&#xff0c;直接放流程给到大家&#xff0c;好歹通过考试了&#xff0c;基本的情况还是能给大家讲解一下的。希望能够给有需要的同学提供点帮助。 先把考试的流程看仔细了&#xff0c;之…

核心乐理---音程名称

定义 音程是连个音之间的距离&#xff0c;是音乐中的距离&#xff0c;可以便于我们描述音符间的距离&#xff0c;便于与他人进行沟通交流。 就好像是厘米&#xff0c;米这些这些物理中的长度单位一样 度 度是音程的单位。 从一个音的名字念到另一个音的名字&#xff0c;一共念…

瑞幸“复制”拼多多

&#xff08;图片来源于网络&#xff0c;侵删&#xff09; 来源 | 螳螂观察 文 | 叶小安 在电商界&#xff0c;拼多多杀出阿里京东围剿重围&#xff0c;奠定现今电商行业“猫狗拼”三分天下的格局&#xff0c;这是多少后辈们参考的范本。 在咖啡界&#xff0c;瑞幸凭借低价…

ESP32基于Arduino框架,SD卡+MAX98357模块+MP3播放器

ESP32基于Arduino框架&#xff0c;SD卡MAX98357模块MP3播放器&#x1f3ac;原创作者的制作教程讲解以及源码&#xff1a; 35 ESP32之简单的完整功能SD卡MP3播放器的制作讲解&#xff08;ESP32-audioI2S库介绍&#xff09;- 基于Arduino链接&#xff1a;https://pan.baidu.com/s…

黑产系列02-黑产画像

黑产无利不起早&#xff0c;在利益的驱动下黑产几乎是屡禁不止&#xff0c;作为风控从业人员我们需要全方位的了解黑产&#xff0c;了解我们的对手&#xff0c;才能知己知彼&#xff0c;接下来我将结合我多年风控经验以及查阅的相关的资源&#xff0c;全方位介绍下黑产以及他们…

matplot绘制动图

import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation import numpy as np plt.rcParams[axes.unicode_minus] False plt.rcParams[font.sans-serif] SimHei# 准备数据 x np.linspace(0,3*np.pi,100) y1 np.sin(x) y2 np.cos(x)#创建画布和子图 …

Python用yield from 实现异步协程爬虫

文章目录一、什么是yield二、yield于列表的区别三、yield from 实现协程一、什么是yield 如果还没有怎么用过的话&#xff0c;直接把yield看做成一种特殊的return&#xff08;PS&#xff1a;本质 generator&#xff08;生成器&#xff09;&#xff09; return是返回一个值然后…

Python网络编程中getservbyport和getservbyname函数的用法

在Python的网络编程中&#xff0c;getservbyport()函数和getservbyname()函数是socket模块中的两个函数&#xff0c;因此在使用这两个函数时&#xff0c;需要导入socket模块。1 getservbyname()函数getservbyname()函数的作用是通过指定服务的名称获取该服务对应的端口号。相关…

BI工具+方案,这是要将大数据分析包了的节奏啊

BI工具是一个为企业提供大数据智能可视化分析功能板块的平台。虽然它提供了包括智能钻取、内存行列计算、多维动态分析等多种智能数据分析功能板块&#xff0c;但工具毕竟是工具&#xff0c;要真正地为企业所用&#xff0c;还需要针对企业的业务发展情况、数据分析需求等制定数…

用ode45解一个带有积分的微分方程(integro-differential equations)

一、问题提出: 这个方程来源于mathworks的论坛 l 这种方程叫 integro-differential equations ,大致是带有 integral term的微分方程。积分肯定是定积分,这类方程有的是变上限的积分,上下限是x或者其他微分的函数。 按照惯例,先分析。积分区间是0-1,x是自变量,y是应…

2022年终总结——工作第五年

2022是本命年&#xff0c;对我来说今年勉强可以算得上是一切顺利吧。 前几年的年终总结 先验收下去年的期望吧 去年的期望还是挺多的嗷&#x1f643; 1、关于订婚和云南一周游 ✅ 今年大概2月底开始上海疫情开始变得很严重&#xff0c;然后就是漫长的三个月封控&#xff0c;…

1.1.3 java学习的环境准备

文章目录1 相关文件准备及下载1.1 JDK下载1.2 开发工具下载1.2.1 eclipse1.2.2 idea2 JDK安装及配置2.1 JDK配置方法一2.2 JDK配置方法二3 eclipse软件安装及配置4 JDK JRE JVM解释&#xff1a;5 关于手写代码1 相关文件准备及下载 1.1 JDK下载 Oracle公司为常见的计算机系统…

【论文速递】ECCV2022 - ConMatch:置信度引导的半监督学习

【论文速递】ECCV2022 - ConMatch&#xff1a;置信度引导的半监督学习 【论文原文】&#xff1a;ConMatch: Semi-Supervised Learning with Confidence-Guided Consistency Regularization 获取地址&#xff1a;https://arxiv.org/abs/2208.08631博主关键词&#xff1a; 半监…

P8630 [蓝桥杯 2015 国 B] 密文搜索

题目描述 福尔摩斯从 X 星收到一份资料&#xff0c;全部是小写字母组成。 他的助手提供了另一份资料&#xff1a;许多长度为 88 的密码列表。 福尔摩斯发现&#xff0c;这些密码是被打乱后隐藏在先前那份资料中的。 请你编写一个程序&#xff0c;从第一份资料中搜索可能隐藏密码…

八大排序算法(C语言实现)

文章目录&#xff1a;1.排序的概念2.常见八大排序算法3.插入排序3.1直接插入排序3.2希尔排序4.选择排序4.1直接选择排序4.2.堆排序5.交换排序5.1冒泡排序5.2快速排序5.2.1快排递归实现5.2.1.1Hoare法&#xff08;霍尔法&#xff09;5.2.1.2挖坑法5.2.1.3双指针法5.2.2快排迭代实…