「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径
Description
Farmer John每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。
John是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个栅栏。你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次。John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束。
每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个顶点)。一个顶点上可连接任意多(>=1)个栅栏。两顶点间可能有多个栅栏。所有栅栏都是连通的(也就是你可以从任意一个栅栏到达另外的所有栅栏)。
你的程序必须输出骑马的路径(用路上依次经过的顶点号码表示)。我们如果把输出的路径看成是一个500进制的数,那么当存在多组解的情况下,输出500进制表示法中最小的一个 (也就是输出第一位较小的,如果还有多组解,输出第二位较小的,等等)。
输入数据保证至少有一个解。
Input
第1行: 一个整数F(1 <= F <= 1024),表示栅栏的数目
第2到F+1行: 每行两个整数i, j(1 <= i,j <= 500)表示这条栅栏连接i与j号顶点。
Output
输出应当有F+1行,每行一个整数,依次表示路径经过的顶点号。注意数据可能有多组解,但是只有上面题目要求的那一组解是认为正确的。
Sample Input
9
1 2
2 3
3 4
4 2
4 5
2 5
5 6
5 7
4 6
Sample Output
1
2
3
4
2
5
4
6
5
7
说明
题目翻译来自NOCOW。
USACO Training Section 3.3
题解
欧拉路径的模板题了吧
预备知识:
欧拉回路:从一个点可以遍历整张图,最后回到原来的点
欧拉通路:从一个点可以遍历整张图,最后回不到原来的点
对于无向图而言:(大前提:图联通
欧拉回路:任意点的度数为偶 起点可随意
欧拉通路:有且仅有两个点度数为奇 在遍历时一定要从一个为奇的点到另一个为奇的点
对于有向图:(还是大前提图联通
欧拉回路:每个点入度==出度
欧拉通路:有且仅有一个点出度-入度==1 为起点;有且仅有一个点入度-出度==1 为终点; 其余的点出度==入度
然后这道题的解法和算法学习都借鉴了排名第一的题解Misaka_Azusa的题解
所以是Hierholzers算法啦!
双向存边,记录每个点的度。
从小到大扫一遍 找有没有度数为奇的点 若有则break,从当前点开始dfs(欧拉通路
如果所有点度为偶则从最小的点开始dfs(欧拉回路
stack<int>st;
void dfs(int x)
{
for(int v=l;v<=r;++v)
if(tu[x][v])
{
tu[x][v]--;
tu[v][x]--;
dfs(v);
}
st.push(x);
return;
}
看代码然后强行理解应该就够了
然后对于stack 一开始自作聪明的成在开头直接输出QAQ
如果有一样的危险想法,讨论区给的这个样例还是蛮助于理解的
以下是全代码
#include<iostream>
#include<cstdio>
#include<stack>
#include<cmath>
using namespace std;
int du[];
int tu[][];
int l,r;
stack<int>st;
void dfs(int x)
{
for(int v=l;v<=r;++v)
if(tu[x][v])
{
tu[x][v]--;
tu[v][x]--;
dfs(v);
}
st.push(x);
return;
}
int main()
{
int f;
scanf("%d",&f);
l=,r=;
for(int i=;i<=f;++i)
{
int x,y;
scanf("%d%d",&x,&y);
tu[x][y]++;
tu[y][x]++;
du[x]++;
du[y]++;
l=min(l,x);
l=min(l,y);
r=max(r,x);
r=max(r,y);
}
int s=l;
for(int i=l;i<=r;++i)
if(du[i]%==){s=i;break;}
dfs(s);
while(!st.empty())
{
printf("%d\n",st.top());
st.pop();
}
return ;
}
YJQ说这是集训队算法(逃
「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径的更多相关文章
- 洛谷P2731 骑马修栅栏 Riding the Fences
P2731 骑马修栅栏 Riding the Fences• o 119通过o 468提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题解 最新讨论 • 数据有问题题 ...
- 洛谷 P2731 骑马修栅栏 Riding the Fences 解题报告
P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样 ...
- 洛谷 P2731 骑马修栅栏 Riding the Fences
P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样 ...
- P2731 骑马修栅栏 Riding the Fences 题解(欧拉回路)
题目链接 P2731 骑马修栅栏 Riding the Fences 解题思路 存图+简单\(DFS\). 坑点在于两种不同的输出方式. #include<stdio.h> #define ...
- USACO Section 3.3 骑马修栅栏 Riding the Fences
题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
- P2731 骑马修栅栏 Riding the Fences
题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶 ...
- 骑马修栅栏 Riding the Fences
题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
- LG2731 骑马修栅栏 Riding the Fences
题意 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点( ...
- [USACO]骑马修栅栏 Riding the Fences
题目链接 题目简述:欧拉回路,字典序最小.没什么好说的. 解题思路:插入边的时候,使用multiset来保证遍历出出答案的字典序最小. 算法模板:for(枚举边) 删边(无向图删两次) 遍历到那个点 ...
随机推荐
- ROS安装环境配置及多版本的切换
环境配置: 为方便起见,我们可以在每次打开终端时让系统自动配置好ROS环境变量,方法如下: echo "source /opt/ros/hydro/setup.bash" > ...
- 【Todo】ssh的原理和实践
有空的时候补充,可以参考 http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html http://www.ruanyifeng.com/ ...
- 【转】DSP是什么--DSP是神马东东??
原文:http://www.eepw.com.cn/article/272908.htm 导读:本文主要介绍的是DSP是什么,不懂得童鞋们快随小编一起学习一下DSP到底是个神马东东吧! 本文引用地址: ...
- Solidworks如何绘制装饰螺纹线
1 插入-注解,装饰螺纹线 2 绘制装饰螺纹线,选择螺纹的边线,标准选择ISO,下面可以选择的范围就确定了(M6的孔,只能选择M8的螺纹或者M10的螺纹),画好之后在3D图中并没有明确的螺纹样式 ...
- VS2013 update4+Cocos2d-x 3.7 Win8下安装方法及配置
1.安装VS 2013 update4 7个G.自己就去网上找吧,一大堆,密钥问度娘. 2.安装及配置python 2.x 这里注意,一定要下载python 3.0下面的版本号. 配置:进行环境变量配 ...
- vs2017 使用GitHub 推送到远程仓储
vs2017下使用github拓展工具无法成功推送,提示“未能推送到远程存储库” 窗口错误显示:发布到远程存储库时遇到错误: Git failed with a fatal error. HttpRe ...
- python的pexpect模块
Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块. P ...
- 查看 python安装目录
打开终端 输入: which python 打开终端 依此输入: python import sys print sys.path
- 在HDInsight中的Hadoop介绍
在HDInsight中的Hadoop介绍 概览 Azure的HDInsight是,部署和规定的Apache™Hadoop®集群在云中,提供用于管理,分析和大数据报告软件框架中的服务. 大数据 数据被描 ...
- Entity Framework 6 Code First系列1: 实体类1:1配置
从4.1版本开始,EF开始支持Code First模式,值得注意的是Code First不是和DataBase First或Model First平级的概念,而是和EDM平级的概念.使用Code Fi ...