📅  最后修改于: 2023-12-03 15:28:43.572000             🧑  作者: Mango
这是一道GATE CS 2014年的考题,题号为第65题。这道题目是一道算法题,需要对一个图进行深度优先搜索,并按照一定的规则输出遍历结果。
给定一个有向无环图,每个节点都有一个数值。按照深度优先搜索的方式遍历这个图,并按照如下规则输出每个节点的值:
请编写一个程序,输入节点数目、每个节点的值以及节点之间的关系,输出遍历结果。
输入:
4
4 2 3 1
1 2
2 3
3 4
输出:
1 2 3 4
该题要求按照深度优先搜索的方式遍历图,并按照一定的规则输出遍历结果。可以考虑使用拓扑排序及深度优先搜索的方法求解。
具体来说,我们可以使用一个队列来存储没有前驱节点的节点,然后不断地从队列头部取出节点,输出该节点的值,并将该节点的所有后继节点的入度减一,若某个节点的入度变为0,则将该节点加入队列中。不断重复以上过程,直到队列为空。
对于某个节点的所有前驱节点的值都已经被输出了,说明该节点的所有后继节点的入度已经减为0,我们可以在深度优先搜索过程中,遍历该节点的所有后继节点,以此来实现按照题目规则输出节点的值。
下面是Python语言的代码实现,包括拓扑排序及深度优先搜索的函数:
from collections import deque
def topo_sort(node_num, nodes, edges):
in_degrees = [0] * node_num
for node in nodes:
for next_node in edges[node]:
in_degrees[next_node] += 1
queue = deque([node for node in nodes if in_degrees[node] == 0])
while queue:
node = queue.popleft()
yield node
for next_node in edges[node]:
in_degrees[next_node] -= 1
if in_degrees[next_node] == 0:
queue.append(next_node)
def dfs(node, edges, values, visited):
visited[node] = True
for next_node in edges[node]:
if not visited[next_node]:
dfs(next_node, edges, values, visited)
print(values[node], end=' ')
if __name__ == '__main__':
node_num = int(input())
nodes = list(range(node_num))
values = list(map(int, input().split()))
edges = [[] for _ in nodes]
for _ in range(node_num):
x, y = map(int, input().split())
edges[x-1].append(y-1)
visited = [False] * node_num
for start_node in topo_sort(node_num, nodes, edges):
if not visited[start_node]:
dfs(start_node, edges, values, visited)
这道题目通过使用拓扑排序及深度优先搜索的方法求解,可以很好地练习算法的基本思想,提高自己的算法能力。同时,这也是GATE CS考试中常考的类型,对于考生来说也是一道不错的挑战。