你是一名在岛上的港口的推销员。你必须访问岛上所有的港口,然后回到出发的港口。因为你不会游泳且害怕大海,所以你在旅途中必须待在陆地上。
岛屿被建模为二维平面上的一个多边形。该多边形是简单多边形,即它的顶点各不相同,且除了相邻边在公共顶点处接触外,没有两条边相交或接触。此外,没有两条相邻边是共线的。岛上的每个港口都被建模为多边形边界上的一个点。你的路线被建模为一条不超出多边形范围的闭合曲线。
在准备旅程时,你想要计算访问所有港口并回到出发港口的路线的最小长度。
输入格式
输入包含一个测试用例,格式如下:
$n$ $m$ $x_1$ $y_1$ $\vdots$ $x_n$ $y_n$ $x'_1$ $y'_1$ $\vdots$ $x'_m$ $y'_m$
第一行包含两个整数 $n$ 和 $m$,满足 $3 \le n \le 100$ 且 $2 \le m \le 100$。其中,$n$ 是建模岛屿的多边形的顶点数,$m$ 是岛上的港口数。接下来的 $n$ 行,每行包含两个整数 $x_i$ 和 $y_i$,表示多边形第 $i$ 个顶点的坐标,其中 $0 \le x_i \le 1000$ 且 $0 \le y_i \le 1000$。多边形的顶点按逆时针顺序给出。随后的 $m$ 行,每行包含两个整数 $x'_j$ 和 $y'_j$,表示第 $j$ 个港口的坐标。路线从 $(x'_1, y'_1)$ 开始并结束。保证所有港口都在多边形的边界上且互不相同。
输出格式
输出一行,表示访问所有港口并回到出发港口的路线的最小长度。输出的相对误差必须在 $10^{-6}$ 以内。
样例
输入 1
4 4 0 0 2 0 2 2 0 2 1 0 1 2 2 1 0 1
输出 1
5.656854249492381
输入 2
8 2 0 0 4 0 4 4 0 4 0 3 3 3 3 1 0 1 0 0 0 4
输出 2
16.64911064067352
说明
这些样例在下图中展示。最短路线用粗线表示。灰色多边形代表岛屿。小圆点代表岛上的港口。注意,路线不必是简单曲线,即路线可以像第二个样例那样自交或重叠,在第二个样例中,两个港口之间的同一路径被使用了两次。
图 J.1. 样例 1
图 J.2. 样例 2