描述
给出一个有向无环图,规定路径是单向且小序号指向大序号,每个节点都有权值。在图上求一条路径使得经过的节点权值和最大,输出路径
示例1
输入:
[5,10,20,5,4,5],[[1,2],[1,4],[2,4],[3,4],[4,5],[4,6],[5,6]]
返回值:
"3-4-5-6"
说明:
很明显 先去第三点权值为20,再去第四个点权值为5,再去第五个点权值为4,再去第六个点权值为5。这个方案最优
以下是Java代码实现:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param potatoNum int一维数组 依次表示序号为1,2,3..的节点的权值
* @param connectRoad int二维数组 每个一维数组[x,y]表示从第x号到第y号有路
* @return string
*/
public String digSum(int[] potatoNum, int[][] connectRoad) {
int n = potatoNum.length;
List<List<Integer>> graph = new ArrayList<>();
for (int i = 0; i < n; i++) {
graph.add(new ArrayList<>());
}
for (int[] road : connectRoad) {
graph.get(road[0] - 1).add(road[1] - 1);
}
int[] maxSum = new int[n];
int[] maxNode = new int[n];
Arrays.fill(maxSum, Integer.MIN_VALUE);
Arrays.fill(maxNode, -1);
maxSum[0] = potatoNum[0];
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (graph.get(j).contains(i)) {
int sum = maxSum[j] + potatoNum[i];
if (sum > maxSum[i]) {
maxSum[i] = sum;
maxNode[i] = j;
}
}
}
}
int maxIndex = 0;
for (int i = 1; i < n; i++) {
if (maxSum[i] > maxSum[maxIndex]) {
maxIndex = i;
}
}
StringBuilder sb = new StringBuilder();
while (maxNode[maxIndex] != -1) {
sb.insert(0, maxIndex + 1);
sb.insert(0, "-");
maxIndex = maxNode[maxIndex];
}
sb.insert(0, 1);
return sb.toString();
}
}
在这个实现中,我们定义了一个名为Solution
的类,其中包含一个名为digSum
的公共方法。该方法接收两个参数:一个名为potatoNum
的整数数组,表示每个节点的权值;一个名为connectRoad
的整数二维数组,表示从第x号到第y号有路。该方法返回一个字符串,表示经过的节点权值和最大的路径。
在方法中,首先定义了一个名为n
的整数,表示节点的数量。然后定义了一个名为graph
的List<List<Integer>>
,用于存储有向无环图的邻接表表示。接下来,使用一个for
循环遍历connectRoad
中的每个一维数组,将其添加到graph
中。
接下来,定义了两个整数数组maxSum
和maxNode
,分别表示从当前节点开始的最大权值和和前一个节点的索引。初始化时,将maxSum
中的所有元素设置为Integer.MIN_VALUE
,将maxNode
中的所有元素设置为-1。然后,使用两个for
循环遍历graph
中的每个节点,计算从该节点开始的最大权值和。
最后,使用一个while
循环从maxNode
中找到最大权值和的路径,并将其添加到StringBuilder
中。最后,返回StringBuilder
中的字符串。