|
|
##[$AcWing$ $1123$](https://www.acwing.com/problem/content/1125/)
|
|
|
|
|
|
### 一、题目描述
|
|
|
随着白天越来越短夜晚越来越长,我们不得不考虑铲雪问题了。
|
|
|
|
|
|
整个城市所有的道路都是双向车道,道路的两个方向均需要铲雪。因为城市预算的削减,整个城市只有 $1$ 辆铲雪车。
|
|
|
|
|
|
铲雪车只能把它开过的地方(车道)的雪铲干净,无论哪儿有雪,铲雪车都得从停放的地方出发,**游历整个城市** 的街道。
|
|
|
|
|
|
现在的问题是:**最少要花多少时间去铲掉所有道路上的雪呢**?
|
|
|
|
|
|
**输入格式**
|
|
|
输入数据的第 $1$ 行表示铲雪车的停放坐标 $(x,y)$,$x,y$ 为整数,单位为米。
|
|
|
|
|
|
下面最多有$4000$行,每行给出了一条街道的起点坐标和终点坐标,坐标均为整数,所有街道都是笔直的,且都是 **双向车道**。
|
|
|
|
|
|
铲雪车可以在任意交叉口、或任何街道的末尾任意转向,包括转 $U$ 型弯。
|
|
|
|
|
|
铲雪车铲雪时前进速度为 $20$ 千米/时,不铲雪时前进速度为 $50$ 千米/时。
|
|
|
|
|
|
保证:铲雪车从起点一定可以到达任何街道。
|
|
|
|
|
|
**输出格式**
|
|
|
输出铲掉所有街道上的雪并且返回出发点的最短时间,精确到分钟,四舍五入到整数。
|
|
|
|
|
|
输出格式为`hours:minutes`,$minutes$不足两位数时**需要补前导零**。
|
|
|
|
|
|
具体格式参照样例。
|
|
|
|
|
|
**数据范围**
|
|
|
$−10^6≤x,y≤10^6$
|
|
|
所有位置坐标绝对值不超过 $10^6$。
|
|
|
|
|
|
**输入样例**:
|
|
|
```cpp {.line-numbers}
|
|
|
0 0
|
|
|
0 0 10000 10000
|
|
|
5000 -10000 5000 10000
|
|
|
5000 10000 10000 10000
|
|
|
```
|
|
|
|
|
|
**输出样例**:
|
|
|
```cpp {.line-numbers}
|
|
|
3:55
|
|
|
```
|
|
|
|
|
|
**样例解释**
|
|
|
输出结果表示共需$3$小时$55$分钟。
|
|
|
|
|
|
### 二、[前导知识](https://www.cnblogs.com/littlehb/p/15129083.html)
|
|
|
|
|
|
#### 欧拉路径
|
|
|
图中所有的边都经过且只经过一次(一笔画)
|
|
|
|
|
|
#### 欧拉回路
|
|
|
起点与终点相同的欧拉路径
|
|
|
<center><img src='https://img-blog.csdnimg.cn/20200509113824520.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3picV90dDU=,size_16,color_FFFFFF,t_70'></center>
|
|
|
|
|
|
<!-- 让表格居中显示的风格 -->
|
|
|
<style>
|
|
|
.center
|
|
|
{
|
|
|
width: auto;
|
|
|
display: table;
|
|
|
margin-left: auto;
|
|
|
margin-right: auto;
|
|
|
}
|
|
|
</style>
|
|
|
<div class="center">
|
|
|
|
|
|
|
|
|
|
|
|
| 类型 | 存在欧拉路径 | 存在欧拉回路 | 总结 |
|
|
|
| ---------- | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------- | -------------------- |
|
|
|
| **无向图** | 度数为奇数的点只能有$0$或$2$个 | 度数为奇数的点只能有$0$个 | 度数是奇数的点有几个 |
|
|
|
| **有向图** | ① 所有点的出度均等于入度 <br>② 除两个点外,其余点出度等于入度, 此两点:一个出度比入度多$1$(起点),另一个入度比出度多$1$(终点) | 所有点的出度均等于入度 | 出度与入度是不是相等 |
|
|
|
</div>
|
|
|
|
|
|
### 三、题目解析
|
|
|
|
|
|
这是个智力题。
|
|
|
|
|
|
这个图很特殊,每个点的入度和出度是一样的。这是一个欧拉图。
|
|
|
|
|
|
所以我们只要把每条路的长度算出来,除以速度就行了。
|
|
|
|
|
|
答案和铲雪车一开始在哪里无关。
|
|
|
|
|
|
**注意**
|
|
|
$50km/h$的速度在本题中没有任何作用,图不需要建出
|
|
|
|
|
|
### $Code$
|
|
|
```cpp {.line-numbers}
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
int main() {
|
|
|
double x1, y1, x2, y2;
|
|
|
cin >> x1 >> y1;
|
|
|
double sum = 0;
|
|
|
while (cin >> x1 >> y1 >> x2 >> y2) {
|
|
|
double dx = x1 - x2;
|
|
|
double dy = y1 - y2;
|
|
|
//欧几里得距离
|
|
|
sum += sqrt(dx * dx + dy * dy) * 2;
|
|
|
// sum += hypot(dx, dy) * 2;
|
|
|
}
|
|
|
// 20千米/小时
|
|
|
int minutes = round(sum / 1000 / 20 * 60);
|
|
|
int hours = minutes / 60;
|
|
|
minutes %= 60;
|
|
|
printf("%d:%02d\n", hours, minutes);
|
|
|
return 0;
|
|
|
}
|
|
|
``` |