在公司的工作安排中,不同的工作可能是互相独立的,也可能是有依赖的。一个任务A是另外一个任务B的前置任务,要A完成后才能进行B,特别地,每个任务可能最多有2个前置任务,而前置任务本身可能也有前置任务。
这样的前置依赖结构可以用树表示,子节点是父节点的前置任务
当有一系列任务分配下来后,由于项目规划的需要,问当最后一个任务(根节点)完成,最少需要多少时间
第一行两个正整数m, n,分别代表总共有树上有m个节点,和树上有n条边,用空格分割下面有m个行,表示每个节点任务的id和所需要的时间,用空格分割下面有n行,每行为3个部分,表示树上的边,用空格分割,第一个数字为某非叶子节点(父节点)的id, 第二个为该边为left还是right,第三个为子节点的id注意:id彼此不会重复,id 1为根节点,2<=m<=1000, 1<=n<=1000,任务时间每个不会大于1000
一个整数,表示最后一个任务(根节点)完成,最少需要多少时间
10 9 1 10 2 20 3 25 4 239 5 41 6 50 7 61 8 72 9 35 10 41 1 left 2 1 right 3 2 left 4 2 right 5 3 left 6 6 left 7 6 right 8 7 left 9 7 right 10
269
如上图所示,最后总的最优时间为10+20+239=269
import java.util.*;
public class Main
{
private static int dfs(int node, Map<Integer, Integer> time, Map<Integer, List<Integer>> children)
{
int left = 0;
int right = 0;
if (children.get(node).get(0) != 0)
left = dfs(children.get(node).get(0), time, children);
if (children.get(node).get(1) != 0)
right = dfs(children.get(node).get(1), time, children);
return Math.max(left, right) + time.get(node);
}
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int m = scanner.nextInt();
Map<Integer, Integer> weights = new HashMap<>();
Map<Integer, List<Integer>> edges = new HashMap<>();
for (int i = 0; i < n; i++)
{
int node = scanner.nextInt();
int w = scanner.nextInt();
weights.put(node, w);
edges.put(node, new ArrayList<>());
edges.get(node).add(0);
edges.get(node).add(0);
}
scanner.nextLine();
for (int i = 0; i < m; i++)
{
String[] edge = scanner.nextLine().split(" ");
int parent = Integer.parseInt(edge[0]);
int child = Integer.parseInt(edge[2]);
if (edge[1].equals("left"))
edges.get(parent).set(0, child);
else
edges.get(parent).set(1, child);
}
System.out.println(dfs(1, weights, edges));
}
}