📜  门| GATE-CS-2014-(Set-1) |第 65 题(1)

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

门| GATE-CS-2014-(Set-1) |第 65 题

这是一道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考试中常考的类型,对于考生来说也是一道不错的挑战。