洛谷 P2731 骑马修栅栏 Riding the Fences之欧拉路径板子

news/2024/11/16 21:46:52/文章来源:https://www.cnblogs.com/qc0817/p/18351943

洛谷P2731题解


传送锚点


摸鱼环节

[USACO3.3] 骑马修栅栏 Riding the Fences

题目背景

Farmer John 每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。

题目描述

John 是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个栅栏。

John 的农场上一共有 \(m\) 个栅栏,每一个栅栏连接两个顶点,顶点用 \(1\)\(500\) 标号(虽然有的农场并没有那么多个顶点)。一个顶点上至少连接 \(1\) 个栅栏,没有上限。两顶点间可能有多个栅栏。所有栅栏都是连通的(也就是你可以从任意一个栅栏到达另外的所有栅栏)。John 能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束。

你需要求出输出骑马的路径(用路上依次经过的顶点号码表示),使每个栅栏都恰好被经过一次。如果存在多组可行的解,按照如下方式进行输出:如果把输出的路径看成是一个 \(500\) 进制的数,那么当存在多组解的情况下,输出 \(500\) 进制表示法中最小的一个 (也就是输出第一位较小的,如果还有多组解,输出第二位较小的,以此类推)。

输入数据保证至少有一个解。

输入格式

第一行一个整数 \(m\),表示栅栏的数目。

从第二行到第 \((m+1)\) 行,每行两个整数 \(u,v\),表示有一条栅栏连接 \(u,v\) 两个点。

输出格式

\((m+1)\) 行,每行一个整数,依次表示路径经过的顶点号。注意数据可能有多组解,但是只有上面题目要求的那一组解是认为正确的。

数据保证至少有一组可行解。

样例 #1

样例输入 #1

9
1 2
2 3
3 4
4 2
4 5
2 5
5 6
5 7
4 6

样例输出 #1

1
2
3
4
2
5
4
6
5
7

提示

对于 \(100\%\) 的数据,\(1 \leq m \leq 1024,1 \leq u,v \leq 500\)

题目翻译来自NOCOW。

USACO Training Section 3.3


这一把熟人局,老将Farmer john申请出战还是日常帮助Farmer john处理休闲问题。今日份的john也是闲的蛋疼骑上了马。不出意外的话就要出题,他居然还想修栅栏,直接干出一道欧拉路径。


正片开始

  1. 我们选择用vector存个图,并将每个点所连接的点按照大小排序,以此处理输出顺序。

code:

for(int i=1;i<=m;i++)
{int u,v;cin>>u>>v;g[u].push_back(v);g[v].push_back(u);b[u][v]++,b[v][u]++;n=max(n,max(u,v));
}
for(int i=1;i<=n;i++) sort(g[i].begin(),g[i].end());
  1. 开始搞点,不断遍历每个点的临界点,在\(a\)\(b\)有边的情况下进行递归处理,并将边删除以免重复计算。

code:

void findx(int x)
{for(int i=0;i<g[x].size();i++){if(b[x][g[x][i]]>0){b[x][g[x][i]]--,b[g[x][i]][x]--;findx(g[x][i]);}}ans[++l]=x;
}
  1. 特判不是欧拉回路的情况,即存在\(g[i].size()\)为奇数。

code:

for(int i=1;i<=n;i++)
{if(g[i].size()%2){findx(i);f=1;break;}
}
if(f==0)
{for(int i=1;i<=n;i++){if(g[i].size()){findx(i);break;}}
}
for(int i=l;i>=1;i--) cout<<ans[i]<<endl;

完整代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+10;
int m,b[N][N],ans[N],l=0,n=0,f=0;
vector<int>g[N];
void findx(int x)
{for(int i=0;i<g[x].size();i++){if(b[x][g[x][i]]>0){b[x][g[x][i]]--,b[g[x][i]][x]--;findx(g[x][i]);}}ans[++l]=x;
}
int main()
{cin>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;g[u].push_back(v);g[v].push_back(u);b[u][v]++,b[v][u]++;n=max(n,max(u,v));}for(int i=1;i<=n;i++) sort(g[i].begin(),g[i].end());for(int i=1;i<=n;i++){if(g[i].size()%2){findx(i);f=1;break;}}if(f==0){for(int i=1;i<=n;i++){if(g[i].size()){findx(i);break;}}}for(int i=l;i>=1;i--) cout<<ans[i]<<endl;return 0;
}

完结收工!!!!!

个人主页

看完点赞,养成习惯

\(\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/780714.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运用Npcap库实现SYN半开放扫描

Npcap 是一款高性能的网络捕获和数据包分析库,作为 Nmap 项目的一部分,Npcap 可用于捕获、发送和分析网络数据包。本章将介绍如何使用 Npcap 库来实现半开放扫描功能。TCP SYN 半开放扫描是一种常见且广泛使用的端口扫描技术,用于探测目标主机端口的开放状态。由于这种方法并…

js模拟Sleep/Delay

原文链接 https://www.51cto.com/article/767574.html 我的总结 看上去比较好的方式: 1.用递增的setTimeOut。 2.用async/await。 最后结论截图 翻译 搜索 复制

支付三大黑盒之二支付引擎

支付系统有三大黑盒“清结算对账、支付引擎和账务系统”,之所以说是黑盒一来是因为他们深藏后台很少被人看到,二来是有会计知识的门槛。这篇文章就用尽可能大白话的语言来介绍三个黑盒之一的“支付引擎”。 一、什么是支付引擎 支付引擎又被称为支付核心,他是支付系统的后台…

你觉得大模型时代该出现什么?

大模型的概念都火了两年了,之前各种媒体吹嘘大模型的出现是类似“蒸汽机时代”、“iPhone时刻”等等。那为什么我们期待的结果都没出现呢?咱们先一起回顾下历史。大模型的概念都火了两年了,之前各种媒体吹嘘大模型的出现是类似“蒸汽机时代”、“iPhone时刻”等等。那为什么…

鸿蒙(HarmonyOS)实现隐私政策弹窗

在实现用户协议弹窗时,通常我们会想到使用系统自定义弹窗,并在弹窗中点击跳转到Web页面。但在HarmonyOS中,由于系统弹窗的显示优先级高于其他组件,即使跳转到Web页面,弹窗依然会显示在最上层。 为了解决这个问题,我们可以自定义一个组件来模拟弹窗,这样当跳转到Web页面时…

软件测试常见术语-几万万人的钉钉、微信软件测试群

3 术语和定义 在本文档中,以下术语和定义适用。 ISO、IEC 和 IEEE 在以下地址维护标准化中使用的术语数据库:ISO 在线浏览平台:https://www.iso.org/obp/ui IEC 电子百科全书:网址:https://www.electropedia.org/ IEEE 在线标准词典:https://ieeexplore.ieee.org/browse/…

dotnet C# 分享基础 for 循环的写法

本文将来和大家聊聊在 dotnet C# 里面的基础的 for 循环语法的写法使用 for 作为循环的写法是在编程里面常用的代码写法。比如说我有一个名为 Foo 的类型,这个类型提供了一个名为 GetCount 的方法,这个方法可以缓慢的获取 Foo 里面的一个代表数量的值。且在 Foo 类型里面提供…

dotnet C# 使用 SHFileOperation 调用 Win32 的文件复制对话框

本文将和大家介绍如何在 dotnet C# 里面使用 SHFileOperation 调用 Windows 自带的文件复制对话框进行文件复制本文核心代码拷贝自 C#中使用SHFileOperation调用Windows的复制文件对话框 - 季风哥 - 博客园 文章,特别感谢大佬提供的方法 实现的效果图如下详细实现逻辑还请大家…

Avalonia 11.1 已知问题 应用启动时 PointToScreen 无法获取正确坐标

本文记录 Avalonia 11.1 版本的已知问题,在 Linux 上使用 X11 时,在应用启动时,即使在 Loaded 或 Activated 事件里,都无法使用 PointToScreen 获取到正确的屏幕坐标,只会将传入的点作为返回值此问题已经报告给 Avalonia 官方,请看 https://github.com/AvaloniaUI/Avalon…

乌龟对对碰开局应该抽几只?

结论:30只以上为佳,3的倍数 https://www.bilibili.com/video/BV17nYVekEWU/?vd_source=9b97428fe30142d2bb4f9bab6ef082a4# Import necessary libraries import numpy as np import random from collections import defaultdict import matplotlib.pyplot as plt# Function …

写一个cpp uos系统

#include <iostream>int main() {std::cout << "Hello, UOS!" << std::endl;return 0; }创建一个test.cpp文件, 在当前目录打开终端, 把上面代码内容写里面, 输入g++ test.cpp, 生成了一个a.out文件, ./a.out 输出 Hello, UOS!

C#项目—彩票选号

C#彩票选号软件 今天做了一个彩票选号的小软件,将学到的知识点总结如下; 1.写程序的思路实体类(属性、方法) 主程序调用类方法2.学到的知识点判断、循环 文件的操作(保存、打开) 集合、数组(增加-AddRange、删除-RemoveAt、排序-Reverse) 关键字:Random(随机数-Next)…