AcWing 1123. 铲雪车(欧拉回路)
原题链接
简单
作者:
仅存老实人
,
2020-09-21 20:50:48
,
所有人可见
,
阅读 2761
/*
戈尼斯基 七桥问题
———————————— 岸
\ / |
o ---o 河
/ \ |
———————————— 岸
1
// \
2 ---3
\\ /
4
边数:
node1 = 3 node3 = 3 node2 = 5 node4 = 3
要能一笔画的话:
起点边数 = 奇数
终点边数 = 奇数
中间点边数= 偶数
所以七桥问题没有一笔画法
欧拉回路:终点就是起点
一、无向图
1 存在欧拉路径的充要条件 : 度数为奇数的点只能有0或2个
2 存在欧拉回路的充要条件 : 度数为奇数的点只能有0个
二、有向图
1 存在欧拉路径的充要条件 : 要么所有点的出度均==入度;
要么除了两个点之外,其余所有点的出度==入度 剩余的两个点:一个满足出度-入度==1(起点) 一个满足入度-出度==1(终点)
2 存在欧拉回路的充要条件 : 所有点的出度均等于入度
_O_ 环可以合并进边 或者环可以和环合并 OO
o
_|_
| |_|_
| |_|
o
对于除了起点与终点外中间的点
由于它们的度数是偶数 则只要它从某一个过环的出度出发 则必然会走完这个环回到这个点
合并环的方法:有环先走环
dfs(u)
{
for 从n出发的所有边
dfs() 扩展
把u加入序列 seq[]←u
}
最终 seq[]中存下的就是欧拉路径的倒序
有向图:
每用一条边 删掉
无向图:
每用一条边标记对应的反向边(XOR技巧)
a→b
b→a
*/
/*
本题
每条路是双向道 -> 每条边都要铲两次:
双向道:每个点的出度==入度
<=>
必然存在欧拉回路
<=>
必然存在一笔画法
o起点
/ \
a---b
\ /
o
最短时间:即刚好一笔画完所有双向边
*/
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
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;//每条边铲2次
}
int minutes = round(sum/1000/20*60);//distance/km/20km/h*60=((d/20)h*60)min
int hours = minutes/60;
minutes%=60;
printf("%d:%02d\n",hours,minutes);
return 0;
}