信息学奥赛一本通 1374:铲雪车(snow)

【题目链接】

ybt 1374:铲雪车(snow)
洛谷 UVA10203 Snow Clearing
注:原题输入要求更复杂,本文代码无法通过。

【题目考点】

1. 图论:欧拉回路

2. 两点间距离公式

d i s = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 dis = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} dis=(x1x2)2+(y1y2)2

【解题思路】

所有的道路都是双车道,对于一条道路,铲雪车每次经过道路只能铲掉一侧的雪,需要来回走两趟才能完全清除这条道路上的雪。
该图是有向图,将每个路口视为顶点,每条车道是一条有向边,每条道路即为双向的有向边。
“铲雪车从起点一定可以到达任何街道”保证了这个图是弱连通图。
要想完成对所有道路铲雪,也就是要把每条边都走一次,这是一个求欧拉路径的问题。
每个路口连接的每条道路都会提供一个入度和一个出度,每个顶点的入度和出度一定相同。该图一定存在欧拉回路。
铲雪车从起点出发,按照欧拉回路顺序走遍图中的每条边(车道),最后回到起点,可以完成铲雪。整个过程中铲雪车一直在铲雪,速度是20km/h。

根据输入,使用两点间距离公式求出每条道路的长度,乘以2后就是所有车道(所有边)的总长度,除以行车速度,即可得到花费的总时间。

【注意】
注意单位换算:速度是km/h,而距离单位是m。
注意变量类型:要使用long long。
注意输出格式;输出分钟不足2位时,前面要补0。

【题解代码】

#include
using namespace std;
int main()
{
    double dis = 0, time;
    long long h, m, ax, bx, ay, by;
    cin >> ax >> ay;
    while(cin >> ax >> ay >> bx >> by)
        dis += 2*sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));//dis:总距离 单位:米
    time = dis / 1000 / 20;//time:总时间,单位:小时
    h = floor(time);//小时数
    m = round((time - h)*60);//分钟数
    cout << h << ':' << setw(2) << setfill('0') << m;//输出分钟,不足2位时左边补0 
    return 0;
}

你可能感兴趣的:(信息学奥赛一本通题解,算法,图论)