📜  门| GATE CS 2019 |问题 22(1)

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

门 | GATE CS 2019 | 问题 22

这是一道关于图论遍历算法的问题,出现在2019年的GATE计算机科学考试中。

问题描述

给定一个无向图,每个节点都有一个可能为空集合的权值。从给定的起点开始遍历图,每当遇到一个节点,就将其权值与已经访问过的节点的权值做 XOR 运算(即异或操作),并将这个新值赋给该节点的权值。图上的遍历按照 BFS 算法进行。已知所有节点的初始权值均为 $\phi$。

现在我们需要编写一段程序来计算按照上述方法遍历完整个图后,所有节点的最终权值之和。程序应该使用队列数据结构来辅助实现 BFS 算法。

样例输入
3
1 2 3
5
0 1
0 4
1 2
2 3
3 4

其中,第 1 行给出了节点个数 $n$;第 2 行给出了节点的初始权值;第 3 行给出了边数 $m$;之后的 $m$ 行给出了每条边的起点和终点。

样例输出
6
解题思路

这道题给出的是一个无向图,但是具体的图形不会对解题产生影响,由此可以考虑直接使用图的邻接表来存储该图。另外,题目要求使用 BFS 算法按节点顺序遍历整个图,这也提示我们要使用队列来辅助实现。

按照 BFS 的逻辑,每次需要从队列里取出一个节点,同时将该节点的所有相邻节点加入队列。我们可以使用一个 boolean 型的 visited 数组来记录哪些节点已经被遍历过。

在遍历节点时,我们需要将该节点和已经遍历过的节点的权值做 XOR 运算,再更新该节点的权值。由于节点的初始权值都为 $\phi$,我们可以直接使用 XOR 运算的结果,而不需要再次将节点的初始权值与遍历过的节点的权值做 XOR 运算。

在遍历完整个图后,所有节点的权值之和即为所求答案。

代码实现

下面是 Python 代码实现,输入格式与题目描述中样例输入相同。请注意,为了简化输入格式,下面的代码中删除了一部分注释内容。

from collections import deque

n = int(input().strip())
values = list(map(int, input().strip().split()))
m = int(input().strip())

graph = [[] for _ in range(n)]
for _ in range(m):
    u, v = map(int, input().strip().split())
    graph[u].append(v)
    graph[v].append(u)

q = deque([0])
visited = [False] * n

while q:
    u = q.popleft()
    visited[u] = True

    for v in graph[u]:
        if not visited[v]:
            values[v] ^= values[u]
            q.append(v)

print(sum(values))

注:在 python 代码中,^ 操作符表示异或操作。在其他编程语言中也可以使用相应的异或操作符。