📜  门|门CS 2011 |第 65 题(1)

📅  最后修改于: 2023-12-03 15:42:22.672000             🧑  作者: Mango

题目介绍

这是一道来自 ACM 门户网站上门户 CS 2011 比赛的第 65 题。

题目描述:

在一个城市里,有一些门可以通往其他城市,每个门有一个开启门需要的钥匙,每个人可以拥有一些钥匙。现在,请你判断在公共汽车开始从起点出发之前,你是否有足够的钥匙能够到达终点城市。

输入:

第一行包含一个整数 T (T ≤ 10),表示测试数据的数量。

对于每组测试数据,第一行包含三个整数 S、E 和 N。S 和 E 分别表示起点和终点的编号,N 表示钥匙的数量。

接下来一行 N 个数字,描述每个钥匙能够开启的门的编号。输入保证每个门最多只能被描述一次。

输出:

对于每组测试数据,如果你有足够的钥匙能够到达终点城市,则输出 "YES"。否则输出 "NO"。每组数据输出一行。

样例输入:

2 0 4 4 1 2 0 4 1 2 2 1 2 样例输出:

YES NO

解题思路

这道题是一道典型的图论问题,我们需要使用深度优先搜索(DFS)来解决。

首先我们需要定义一个图(Graph)类来存储所有门的信息,包括门的编号和该门需要的钥匙。然后我们需要定义一个方法来进行深度优先搜索,搜索时需要传递当前城市的编号、目标城市的编号和当前拥有的钥匙数量。

在进行深度优先搜索时,我们首先需要判断当前城市是否是目标城市,如果是则说明我们已经找到了一条可行的路径,返回 true。否则,我们需要遍历当前城市所有能够到达的城市,判断该城市门是否需要当前拥有的钥匙或者在当前拥有的钥匙中是否包含该门需要的钥匙。如果需要钥匙而我们没有钥匙,则继续搜索下一条路径。如果拥有该钥匙,则继续搜索下一条路径。如果该门不需要钥匙,则继续搜索下一条路径。

如果遍历完所有能够到达的城市后仍然没有找到可行的路径,则返回 false。

最后我们只需要对每组测试数据进行深度优先搜索,判断是否能够到达目标城市即可。

代码实现

以下是代码实现的部分关键代码,建议结合完整代码食用:

class Graph:
    def __init__(self, n):
        self.n = n  # 城市个数
        self.g = [[] for _ in range(n)]  # 存储图的信息
        self.keys = [[] for _ in range(n)]  # 存储每个城市能够得到的所有钥匙

    def add_edge(self, u, v, k):
        """
        添加一条从城市 u 到城市 v 的道路,需要 k 把钥匙
        """
        self.g[u].append((v, k))

    def add_key(self, u, k):
        """
        向城市 u 添加一把钥匙能够打开的门的编号
        """
        self.keys[u].append(k)

def dfs(graph, u, v, keys):
    """
    判断能否从城市 u 到达城市 v
    """
    if u == v:
        return True  # 找到了可行路径

    for city, need_key in graph.g[u]:
        # 判断该城市是否需要某把钥匙或者已经拥有该钥匙
        if need_key in keys or need_key in graph.keys[u]:
            if dfs(graph, city, v, keys + graph.keys[city]):
                return True

    return False

# main 函数
if __name__ == "__main__":
    t = int(input())
    for _ in range(t):
        s, e, n = map(int, input().split())
        keys = set(map(int, input().split()))
        g = Graph(1000)
        for i in range(n):
            u, v, k = map(int, input().split())
            g.add_edge(u, v, k)
            g.add_key(v, k)
        print("YES" if dfs(g, s, e, keys) else "NO")

以上代码使用 Python 语言实现,完整代码请参考 ACM 门户网站上门户 CS 2011 比赛的第 65 题。