树形dp
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int n = in.nextInt(); int s = in.nextInt(); ArrayList<HashSet<Integer>> map = new ArrayList<>(); for (int i = 0; i <= n; i++) map.add(new HashSet<>()); int u, v; for (int i = 0; i < n - 1; i++) { u = in.nextInt(); v = in.nextInt(); map.get(u).add(v); map.get(v).add(u); } boolean[] isvisited = new boolean[n + 1]; int[][] dp = new int[n + 1][2]; //dp[i][0] 表示如果不住在i,以i为根的子树能旅游的最长时间 dfs(map, dp, isvisited, s); System.out.println(dp[s][1]); } private static void dfs(ArrayList<HashSet<Integer>> map, int[][] dp, boolean[] isvisited, int curCity) { isvisited[curCity] = true; for (int child : map.get(curCity)) { if (isvisited[child]) continue; dfs(map, dp, isvisited, child); dp[curCity][0] += Math.max(dp[child][0],dp[child][1]); dp[curCity][1] += dp[child][0]; } dp[curCity][1]++; // 如果住在当前城市,至少要住 1 天 } }