粗略的大致思路如下:
0 )为了解题需要建 graph
1 )计算每个线段的长度,把线段长度记为 graph 中每个 node 的权值
2 )对于任意的两条线段 s1, s2,求 s1 两端两点到 s2 两端两点,总共 4 段跳转线段的长度,并保留最短的那条作为 node s1 到 node s2 的 edge 的权值
3 )这样题目的数据就转化成了一个 complete graph,因为要走过每个点,每个 node 的权值和结果无关(这部分永远是要加在一起,加入最短路径里的)
4 )总结:预处理之后实际上是要找到一条路径遍历所有 node 且不重复经过其中一个 node,这个问题是 NP-complete 的,参见
https://en.wikipedia.org/wiki/Hamiltonian_path5 )具体做法我脑子笨,只能想到一个略暴力的动归:a[s][i][j]表示对于一个 graph 中所有 node 的子集 s,从 node i 到 node j 可得到的最短遍历路径
如果指定起点的话就是 a[s][i],表示在子集 s 中从起点到终点 node i 可找到的最短遍历路径,但不管哪种,枚举 s 需要 O(2^n),500 的数据规模怎么看都不太现实