目前在 make 中调用 `DirectedGraph#checkCyclic()` 来检查是否存在环。每次代价是 O(n),总体 O(n^2),n 为 make 被调用的次数。 优化思路:增量构造一个 Set 穿透每个 make dfs 中从 根 到 叶 的路径。每次代价减小到 O(1)。