【LeetCode】LCP 07. 传递信息


题目地址:https://leetcode-cn.com/problems/na-ying-bi/

题目描述

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

  1. 有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0
  2. 每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。
  3. 每轮信息必须需要传递给另一个人,且信息可重复经过同一个人

给定总玩家数 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

限制:

  1. 2 <= n <= 10
  2. 1 <= k <= 5
  3. 1 <= relation.length <= 90, 且 relation[i].length == 2
  4. 0 <= relation[i][0],relation[i][1] < n 且 relation[i][0] != relation[i][1]

题目大意

给出了一个有向图,问从 起点 0 出发,经过 k 次到达 N - 1的方案数有多少。

解题方法

BFS

这个题目是个搜索问题,可以用 DFS和 BFS 解决,两者没有优劣之分。

如果使用 BFS,可以用记录步数的 BFS 模板。把起点 0 先放入队列中,每一次把现在队列中已经有的每个节点的后续的所有的节点都放到队列中,即同时走了一步。当总的走了 k 步并且恰好到了 N - 1的时候,就是一个合理的路径。

由于题目说了,信息可以重复经过同一个人,所以不需要记录节点是否visited。

Python代码如下:

class Solution:
    def numWays(self, n: int, relation: List[List[int]], k: int) -> int:
        queue = collections.deque()
        queue.append(0)
        step = 0
        res = 0
        while queue and step <= k:
            size = len(queue)
            for i in range(size):
                cur = queue.popleft()
                if cur == n - 1 and step == k:
                    res += 1
                for rel in relation:
                    if rel[0] != cur:
                        continue
                    nxt = rel[1]
                    queue.append(nxt)
            step += 1
        return res

欢迎关注负雪明烛的刷题博客,leetcode刷题800多,每道都讲解了详细写法!

日期

2020 年 4 月 18 日 —— 个人赛蒙了

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页