内容相似,原题可参考codefunP1190
直接先上代码。。。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static List<List<Integer>> pp = new ArrayList<>();
public static int[] values;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
values = new int[n];
for (int i = 0; i < n; i++) {
pp.add(new ArrayList<>());
}
for (int i = 0; i < n; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
int val = sc.nextInt();
if(b!=-1){
pp.get(b).add(a);
}
values[a] = val;
}
List<Integer> vs = new ArrayList<>();
for (int i = 0; i < n; i++) {
dfs(i,0,vs);
}
int maxV=Integer.MIN_VALUE;
for (Integer v : vs) {
maxV = Math.max(maxV, v);
}
System.out.println(maxV);
}
public static void dfs( int cur, int curV, List<Integer> vs){
if(pp.get(cur).size()==0){
curV+=values[cur];
vs.add(curV);
return;
}
curV+=values[cur];
vs.add(curV);
for (int i = 0; i < pp.get(cur).size(); i++) {
dfs(pp.get(cur).get(i),curV,vs);
}
}
}
代码写的很基础,自己理解的在codefun上面能AC。
首先,按照题意,第二个数是传送门的父亲结点,第一个数才是本节点,用List来存储各个结点的下一个结点,例如样例中的0的list中包括4,3,用数组values记录每个结点的食物数量;思路就是深度遍历(DFS),以每个结点为头,去遍历到达每个位置中止的食物量,并将此种情况下的数量加入list。完成后取个list中的最大值即可。
DFS的思路就是,cur表示目前访问的结点,curV表示到达这个节点前我已经获得的食物量,遇到出度为0的结点或者就是当前节点都将食物量加入list,然后对其下一个节点也做DFS,可得出答案。