假设存在一个函数 f 表示以某个点为起点的合法路径条数。那么答案就是对所有点的 f 函数求和。关键在于因为数据很大,如何高效地计算函数 f 的值。
令函数 f 有两个参数 c(当前点)与 C (一个表示目前已经用过的颜色的 bitset,初始为 0)。由于一条路径上的颜色个数最多为 5,所以这样的 bitset 最多有 2^5=32 个。这意味着函数 f(c,\,C) 的参数的组合数小到我们可以打表:我们使用动态规划算法。
对参数 c 和 C 进行记忆化搜索,我们需要对所有相邻 c 和 C 将函数 f(c',\,C') 的值求和,其中 C' 为与 C 相同的 bitset,但是表示颜色 c 的二进制位被标记了。我们保证不重复使用颜色,并且不会重复计算之前计算过答案的状态的答案。如此以来,问题的答案就是 \sum f(i,\, 0) (需要保证不要计算长度为 1 的路径!),还要注意使用 64 位整数。