洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences
题意描述
每个栅栏是一条无向边,找出字典序最小的欧拉路。数据保证至少有一个解。
最多 \(500\) 个点, \(1024\) 条边。
分析
看着如此微小的数据范围,随便瞎搞都行使用矩阵来存储边,同时记录每个点的度。
根据欧拉路的要求,如果图中存在唯一/唯二的奇度点,那么起点一定是这个点/这两个点中更小的点。如果都是偶度点,则根据字典序最小的原则,从最小序号的点出发。
值得注意的是,可能有重边,所以每次dfs进入一个点时,不应该把这条边清零,而是减少一条边即可。
至于输出答案,不能在刚刚进入dfs的时候就输出,否则就会贪心贪错了。试想,从一个奇度点出发,这搜索路上可能会先遇到另一个奇度点,结果就先进入了这个点,把这个奇度点直接输出了!那当然是不行的!那么应该如何做呢?只需在回溯的时候用栈记录这个点即可,这样先回溯的这个点(第一个回溯的一定是第二个奇度点)会先被压入栈底,最后倒叙输出即可。
示范:
void dfs(int x)
{
// cout<<x<<endl; //wrong answer
for(re int i=minn;i<=maxn&&!succ;i++)
{
if(map[x][i])
{
map[x][i]--;map[i][x]--;
dfs(i);
}
}
way.push_back(x); //accept
}
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
#define LL long long
#define ULL unsigned long long
#define re register
#define debug printf("Now is %d\n",__LINE__);
using namespace std;
template<class T>inline void read(T&x)
{
char ch=getchar();
while(!isdigit(ch))ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
}
inline int read()
{
int x=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
x=ch-'0';ch=getchar();
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return x;
}
int G[55];
template<class T>inline void write(T x)
{
int g=0;
if(x<0) x=-x,putchar('-');
do{G[++g]=x%10;x/=10;}while(x);
for(re int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
}
int map[600][600];
int m,maxn=0,minn=1000;
int degree[600];
vector<int>way;
bool succ;
void dfs(int x)
{
// cout<<x<<endl;
for(re int i=minn;i<=maxn&&!succ;i++)
{
if(map[x][i])
{
map[x][i]--;map[i][x]--;
dfs(i);
}
}
way.push_back(x);
}
int main()
{
m=read();
for(re int i=1,a,b;i<=m;i++)
{
a=read();
b=read();
map[a][b]++;map[b][a]++;
degree[a]++;
degree[b]++;
maxn=max(maxn,max(a,b));
minn=min(minn,min(a,b));
}
re int flag=0;
for(re int i=minn;i<=maxn;i++) if(degree[i]) {flag=i;break;}
for(re int i=minn;i<=maxn;i++) if(degree[i]&1) {flag=i;break;}
dfs(flag);
while(!way.empty()) cout<<way.back()<<endl,way.pop_back();
return 0;
}
洛谷 P2731 [USACO3.3]骑马修栅栏 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 ...
- P2731 骑马修栅栏 Riding the Fences
题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶 ...
- USACO Section 3.3 骑马修栅栏 Riding the Fences
题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
- LG2731 骑马修栅栏 Riding the Fences
题意 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点( ...
- 「USACO」「LuoguP2731」 骑马修栅栏 Riding the Fences(欧拉路径
Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编 ...
- 骑马修栅栏 Riding the Fences
题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个 ...
- 洛谷 题解 P2731 【骑马修栅栏 Riding the Fences】
简单的开始 完美の开始 这里数组什么的用来干什么后面标注的清楚了 #include<iostream> #include<cstdio> #include<cmath&g ...
随机推荐
- k8s DCGM GPU采集指标项说明
dcgm-exporter 采集指标项 https://help.aliyun.com/document_detail/433222.html#section-oin-6mf-6j0 指标 解释 dc ...
- linux tmux 使用教程
前言 Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具. 本文介绍如何使用 Tmux. 一.Tmux 是什么? 1.1 会话与进程 命令行的典型使用 ...
- Golang 入门 : 类型系统介绍
Go语言类型系统 从计算机底层看,所有的数据都是由比特组成,但计算机一般操作的是固定大小的数,如整数.浮点数.比特数组.内存地址等.但是直接操控底层计算机指令进行编程是非常繁琐和容易出错的,所以Go语 ...
- 获取不到http请求头自定义参数
对外提供的API,需请求方在http请求头中传app_id(下划线分割) 然后服务端通过request.getHeader("app_id")获取不到对应的参数值 排查原因,是因为 ...
- 集合的通用遍历方法--java进阶day09
1.集合的三种通用遍历方法 之前我们学习过集合的遍历方法,为什么这里还要再学呢? 这是因为,之前我们用的遍历方法使用了索引,但我们知道set接口的实现类的集合均无索引,所以我们要学习通用的遍历方法 2 ...
- word突然无法转换latex公式的解决尝试
正常情况下我在word插入复制的latex公式步骤如下(以\(\mu\neq 10\)为例): 把\(\mu\neq 10\)粘贴到word文档中,选中\(\mu\neq 10\)并同时按下alt和等 ...
- Unity Mask原理及自定义遮罩
主要内容 StencilBuffer是什么? 自定义Shader来实现遮罩 Unity Mask的原理 1.什么是StencilBuffer GPU在渲染前会为每个像素点分配一个1字节(8位)大小的内 ...
- C#实例判空
- [开源] .Net 使用 ORM 访问 人大金仓数据库
前言 京人大金仓信息技术股份有限公司(以下简称"人大金仓")是具有自主知识产权的国产数据管理软件与服务提供商.人大金仓由中国人民大学一批最早在国内开展数据库教学.科研.开发的专家于 ...
- python-docx设置标题颜色
from docx import Document from docx.enum.text import WD_PARAGRAPH_ALIGNMENT from docx.shared import ...