1124. 骑马修栅栏

题目链接

1124. 骑马修栅栏

农民John每年有很多栅栏要修理。

他总是骑着马穿过每一个栅栏并修复它破损的地方。

John是一个与其他农民一样懒的人。

他讨厌骑马,因此从来不两次经过一个栅栏。

你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次。

John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束。

每一个栅栏连接两个顶点,顶点用 1500 标号(虽然有的农场并没有 500 个顶点)。

一个顶点上可连接任意多( 1 )个栅栏。

所有栅栏都是连通的(也就是你可以从任意一个栅栏到达另外的所有栅栏)。

你的程序必须输出骑马的路径(用路上依次经过的顶点号码表示)。

我们如果把输出的路径看成是一个500进制的数,那么当存在多组解的情况下,输出500进制表示法中最小的一个 (也就是输出第一个数较小的,如果还有多组解,输出第二个数较小的,等等)。

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

输入格式

1 行:一个整数 F,表示栅栏的数目;

2F+1 行:每行两个整数 i,j 表示这条栅栏连接 ij 号顶点。

输出格式

输出应当有 F+1 行,每行一个整数,依次表示路径经过的顶点号。

注意数据可能有多组解,但是只有上面题目要求的那一组解是认为正确的。

数据范围

1F1024,
1i,j500

输入样例:

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

输出样例:

1 2 3 4 2 5 4 6 5 7

解题思路

欧拉路径

显然,要求的是一条欧拉路径,关键在于如何保证字典序最小,由于求欧拉路径dfs最终保存的结果是逆序的,所以在扩展点的时候,应从小到大扩展,因为小的点是最后被加入答案的,符合逆序输出,另外开始的点一定是欧拉路径的最小的点,他应该放在最后被扩展

  • 时间复杂度:O(n2)

代码

// Problem: 骑马修栅栏 // Contest: AcWing // URL: https://www.acwing.com/problem/content/1126/ // Memory Limit: 64 MB // Time Limit: 1000 ms // %%%Skyqwq #include <bits/stdc++.h> #define pb push_back #define fi first #define se second #define mp make_pair using namespace std; typedef long long LL; typedef pair<int, int> PII; template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; } template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; } template <typename T> void inline read(T &x) { int f = 1; x = 0; char s = getchar(); while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); } while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar(); x *= f; } const int N=550; int m,res[2*N],cnt,g[N][N],d[N]; void dfs(int u) { for(int i=1;i<=500;i++) { if(g[u][i]) { g[u][i]--,g[i][u]--; dfs(i); res[++cnt]=i; } } } int main() { scanf("%d",&m); while(m--) { int a,b; scanf("%d%d",&a,&b); g[a][b]++,g[b][a]++; d[a]++,d[b]++; } int st=1; while(!d[st])st++; for(int i=1;i<=500;i++) if(d[i]&1) { st=i; break; } dfs(st); res[++cnt]=st; for(int i=cnt;i;i--) printf("%d\n",res[i]); return 0; }

__EOF__

本文作者acwing_zyy
本文链接https://www.cnblogs.com/zyyun/p/15850296.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   zyy2001  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示