📅  最后修改于: 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。
参考了以下博客: