📜  门| GATE-CS-2015(套装3)|第 65 题(1)

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

题目介绍

这道题目出自GATE-CS-2015(套装3)的第65题,题目难度较高,考查了编程思维和数据结构知识。

题目描述

给定一个有向图,每个节点都有一个权重值,现在定义一条路径的value为路径经过的所有节点的权重值的乘积,求从起点到终点的所有路径的value中的最大值。

输入输出格式

输入: 第一行为节点个数N,节点编号从0到N-1 第二行为N个数字,表示每个节点的权重值 接下来的M行,每行3个数字,表示一条有向边,起点,终点,边权重

输出: 一个数字,表示从起点到终点的所有路径的value中的最大值

样例输入输出

样例输入:

5 1 2 3 4 5 0 1 3 0 2 7 1 2 2 1 3 6 2 3 1 2 4 9 3 4 2

样例输出:

126

解题思路

本题需要求出从起点到终点的所有路径的value中的最大值,可以采用深度优先搜索(DFS)+动态规划(DP)的思路来求解。

具体而言,首先遍历整个有向图,记录每个节点的入度和出度。因为要求的是所有路径的value中的最大值,必须遍历每个节点和每条边。然后构建一个一维数组weight,用来存储每个节点的权重值,数组下标即对应节点编号。

接下来,采用DFS的方式遍历整个有向图,从起点开始,每个节点依次作为当前路径的终点。在DFS过程中,使用一个一维数组maxValue,用来记录当前路径的value的最大值。采用DP思路,假设当前要遍历的节点为i,那么i节点的最大value可以通过其前驱节点的value和i的权重值相乘得到,即:

maxValue[i] = max(maxValue[j] * weight[i]), 其中j为i的前驱节点,表示从起点到j的路径经过i的路径的value的最大值。

最后,遍历完成后,maxValue[终点]即为起点到终点的所有路径的value中的最大值。

代码片段
def dfs(node, value):
    global weight, maxValue, inDegrees, outDegrees, graph
    maxValue[node] = value * weight[node]
    for i in range(outDegrees[node]):
        nextNode = graph[node][i][0]
        nextValue = graph[node][i][1]
        dfs(nextNode, nextValue*value)
        maxValue[node] = max(maxValue[node], maxValue[nextNode]*weight[node])

n = int(input())
weight = list(map(int,input().split()))
inDegrees = [0 for i in range(n)]
outDegrees = [0 for i in range(n)]
graph = [[] for i in range(n)]
maxValue = [0 for i in range(n)]

m = int(input())
for i in range(m):
    a,b,w = map(int,input().split())
    graph[a].append([b,w])
    inDegrees[b] += 1
    outDegrees[a] += 1

start = None
end = None
for i in range(n):
    if inDegrees[i] == 0:
        start = i
    if outDegrees[i] == 0:
        end = i

dfs(start,1)
print(maxValue[end])

其中,weight、inDegrees、outDegrees、graph和maxValue分别表示节点的权重值、节点的入度和出度、有向图的邻接表、节点的最大value。

参考资料

参考了以下博客:

  1. GATE CS 2015 (Set 3)| Q 65
  2. GATE-CS-2015 (Set 3) Question 65