#icpc2015summerday4h. [icpc2015summer_day4_h]Laser Cutter

[icpc2015summer_day4_h]Laser Cutter

问题描述

Ciel打算进行木工制作。Ciel想要使用激光切割机在一块木板上做一个切口。

为了简单起见,我们假设木板是一个二维平面。木板上有几个分段,Ciel想要沿着这些分段切割木板。每个分段都有一个方向,Ciel必须沿着它们的方向切割这些分段。当你忽略方向时,这些分段是相连的,也就是说,分段上的任意两点通过这些分段直接或间接地相连。

当激光切割机处于开启状态时,它会发射一束激光,击中木板的某个点并沿着其轨迹切割木板。激光最初指向(x,y)(x, y)。Ciel可以进行以下两种操作:

  • 将激光切割机带电移动并沿着其方向切割(一部分)分段,或者
  • 将激光切割机带电移到任意位置。Ciel不一定需要一次性切割整个分段;她可以在分段的任意点上开始或停止切割分段。

Ciel喜欢高效,因此她想知道最短路径,使得激光切割机切割所有分段的整个部分,然后返回到初始点。您的任务是编写一个程序,计算激光切割机的最小总移动距离。


输入

输入的第一行包含一个整数nn1n3001 \leq n \leq 300),表示分段的数量。接下来一行包含两个整数xxyy1,000x,y1,000-1{,}000 \leq x, y \leq 1{,}000),表示激光的初始位置(x,y)(x, y)。接下来的nn行中的第ii行包含四个整数sxisx_isyisy_itxitx_ityity_i1,000sxi,syi,txi,tyi1,000-1{,}000 \leq sx_i, sy_i, tx_i, ty_i \leq 1{,}000),表示它们是第ii个分段的端点,并且激光切割机可以沿着方向由(sxi,syi)(sx_i, sy_i)指向(txi,tyi)(tx_i, ty_i)来切割木板。输入满足以下条件:对于所有的ii1in1 \leq i \leq n),(sxi,syi)(txi,tyi)(sx_i, sy_i) \neq (tx_i, ty_i)。初始点(x,y)(x, y)位于至少一个给定分段上。对于所有不同的i,ji, j1i,jn1 \leq i, j \leq n),第ii个分段和第jj个分段至多共享一个点。


输出

输出一行,包含激光切割机需要移动的最小总距离,以便切割所有分段并返回到初始点。绝对误差或相对误差应小于10610^{-6}


示例输入1

3
0 1
0 0 0 1
0 1 0 2
0 2 0 3```

### 示例输出1

```plain
6.0000000000000000```

---

### 示例输入2

```plain
2
0 1
0 0 0 2
-1 1 1 1```

### 示例输出2

```plain
6.8284271247461900```

---

### 示例输入3

```plain
5
0 0
0 0 1 0
1 1 -1 1
-1 1 -1 -1
-1 -1 1 -1
1 -1 1 1```

### 示例输出3

```plain
10.0000000000000000```