这个题,其实比较简单的,开始的时候代码写的有问题,根节点root计算错了,没有发现,把代码改的乱七八糟的。
加了过多没用的判断。
也不准备优化了。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static Node1352[] nodes;
public static void main(String[] args) throws Exception{
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(reader.readLine());
int N=Integer.parseInt(st.nextToken());//员工的个数
nodes=new Node1352[N+1];
for (int i = 1; i <=N ; i++) {
st=new StringTokenizer(reader.readLine());
nodes[i]=new Node1352(i,Integer.parseInt(st.nextToken()),i);
}
for (int i = 1; i <N ; i++) {
st=new StringTokenizer(reader.readLine());
int no=Integer.parseInt(st.nextToken());
int pno=Integer.parseInt(st.nextToken());
nodes[no].pid=pno;
nodes[pno].sonList.add(no);
}
int root=0;
for (int i = 1; i <=N ; i++) {
if(nodes[i].pid==i){
root=i;
break;
}
}
//System.out.println("root:"+root);
System.out.println(Math.max(getInScore(root),getNotInScore(root)));
reader.close();
}
public static int getInScore(int index){//要么自己来,分数=自己的分数+直接下属不来的分数
if(nodes[index].inScore!=0){
return nodes[index].inScore;
}else if(nodes[index].sonList==null ||nodes[index].sonList.size()<=0){//自己来,又没有子节点,直接返回自己
return nodes[index].inScore=nodes[index].score;
}else{
int ss=0;//直接下属不来的分数
if(nodes[index].sonList!=null && nodes[index].sonList.size()>0){
for (int sonId :nodes[index].sonList) {
ss=ss+getNotInScore(sonId);
}
return nodes[index].inScore=nodes[index].score+ss;//上司要是来,分数=上司的分数+直接下属不来的分数
}else{//自己来,且没有下属
return nodes[index].inScore=nodes[index].score;
}
}
}
public static int getNotInScore(int index){//要么自己不来,分数=Math.max(直接下属来,直接下属不来);
if(nodes[index].notInScore!=0){
return nodes[index].notInScore;
}else if(nodes[index].sonList==null ||nodes[index].sonList.size()<=0){//没有子节点,自己又不来,返回0
return nodes[index].notInScore=0;
}else{
int sn=0;//直接下属不来的分数
int si=0;//直接下属来的分数
if(nodes[index].sonList!=null && nodes[index].sonList.size()>0) {
for (int sonId : nodes[index].sonList) {
sn = sn + getNotInScore(sonId);
si=si+getInScore(sonId);
}
return nodes[index].notInScore=Math.max(si,sn);
}else{
return nodes[index].notInScore=0;
}
}
}
}
class Node1352{
//要么自己不来,分数=Math.max(直接下属来,直接下属不来);
//要么自己来,分数=自己的分数+直接下属不来的分数
int index;
int pid;
int score;//自己的分数
int notInScore;//自己不来时的分数
int inScore;//自己来时候的分数
List<Integer> sonList;//子节点
public Node1352(int index, int score, int pid) {
this.index = index;
this.score = score;
this.pid = pid;
this.sonList=new ArrayList<>();
}
}