返回题解分享
讨论 / 题解分享/ 帖子详情

生命之树(编程题) - 题解

看到还没有人提交,我交一下我的题解

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	static ArrayList<Integer> graph[];
	static int n, v[];
	static long dp[];

	public static void main(String[] args) {
		Scanner scanner = new Scanner(new BufferedInputStream(System.in));
		PrintWriter writer = new PrintWriter(new BufferedOutputStream(System.out));
		long res = 0;

		n = scanner.nextInt();
		graph = new ArrayList[n + 1];

		v = new int[n + 1];
		dp = new long[n + 1];
		for (int i = 1; i <= n; i++) {
			v[i] = scanner.nextInt();
			graph[i] = new ArrayList<Integer>();
		}
		for (int i = 1; i < n; i++) {
			int a = scanner.nextInt();
			int b = scanner.nextInt();
			graph[a].add(b);
			graph[b].add(a);
		}

		dfs(1, -1);

		res=dp[1];
		for(int i=2;i<=n;i++) {
			res=Math.max(res, dp[i]);
		}
		writer.print(res);
		writer.flush();
		scanner.close();

	}

	static void dfs(int current, int father) {
		dp[current] = v[current];

		for (int son : graph[current]) {
			if(son!=father) {
				dfs(son, current);
				dp[current]+=Math.max(0l, dp[son]);
			}
		}

	}
}
0 回复 0 转发 0 喜欢 1 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!