P14851 [ICPC 2022 Yokohama R] Traveling Salesperson in an Island

题目描述

你是岛上某个港口的销售员。你需要拜访岛上的所有港口,然后返回起始港口。因为你不会游泳且害怕大海,所以在旅途中必须停留在陆地上。 该岛被建模为二维平面上的一个多边形。该多边形是 **简单的**,即其顶点互不相同,且除相邻边在其公共顶点处相接外,没有两条边相交或相触。此外,没有两条相邻边共线。岛上的每个港口被建模为多边形边界上的一个点。你的路线被建模为一条不超出多边形范围的闭合曲线。 为了准备这次旅程,你想计算拜访所有港口并返回起始港口的最短路线长度。

输入格式

输入由单个测试用例组成,格式如下。 $$ \begin{aligned} &n \ m \\ &x_1 \ y_1 \\ &\vdots \\ &x_n \ y_n \\ &x'_1 \ y'_1 \\ &\vdots \\ &x'_m \ y'_m \end{aligned} $$ 第一行包含两个整数 $n$ 和 $m$,满足 $3 \leq n \leq 100$ 和 $2 \leq m \leq 100$。其中 $n$ 是建模岛屿的多边形的顶点数,$m$ 是岛上的港口数量。接下来的 $n$ 行,每行包含两个整数 $x_i$ 和 $y_i$,是多边形第 $i$ 个顶点的坐标,其中 $0 \leq x_i \leq 1000$ 且 $0 \leq y_i \leq 1000$。多边形的顶点按逆时针顺序给出。接下来的 $m$ 行,每行包含两个整数 $x'_j$ 和 $y'_j$,是第 $j$ 个港口的坐标。路线从 $(x'_1, y'_1)$ 开始并结束。保证所有港口都位于多边形的边界上且互不相同。

输出格式

在一行中输出拜访所有港口并返回起始港口的最短路线长度。输出的相对误差必须在 $10^{-6}$ 以内。

说明/提示

这些样例如下图所示。最短路线用粗线表示。灰色多边形代表岛屿。小圆盘代表岛上的港口。注意,路线不一定非得是简单的,即路线可以自相交或重叠,如第二个样例中,两个港口之间的同一条路径被使用了两次。 :::align{center} ![](https://cdn.luogu.com.cn/upload/image_hosting/ytcdxshj.png) 图 J.1. 样例 1 图 J.2. 样例 2 :::