当前位置:首页 > 图论 > 欧拉回路 > 正文
SSOJ2429骑马修栅栏
2928+

题目大意:有500个以内的顶点,以及1024以内条边,如何从一个点出发,走完所有边,且每条边只访问一次?

题目描述

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

John是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个一个栅栏。你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次。John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束。

每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个顶点)。一个顶点上可连接任意多(>=1)个栅栏。所有栅栏都是连通的(也就是你可以从任意一个栅栏到达另外的所有栅栏)。

你的程序必须输出骑马的路径(用路上依次经过的顶点号码表示)。我们如果把输出的路径看成是一个500进制的数,那么当存在多组解的情况下,输出500进制表示法中最小的一个 (也就是输出第一个数较小的,如果还有多组解,输出第二个数较小的,等等)。 输入数据保证至少有一个解。

输入

第1行:一个整数F(1<=F<=1024),表示栅栏的数目;

第2到F+1行:每行两个整数i,j(1<=i,j<=500)表示这条栅栏连接i与j号顶点。

输出

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

样例输入

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

解题思路

统计每个点的度,如果没有奇点,从最小点出发;如果有2个奇点,从小的那个奇点出发。搜索时,有路走就走,并记录该边“走过”不能再走;当一个点已经不能再走下去,说明该点就没有可走的边,依次入栈最后倒着输出即是欧拉路或者欧拉回路。为了保证字典需或者进制数最小,编号小的点先走。

程序实现

对于一些点很多的稀疏图,用邻接矩阵效率低,且浪费空间,可以考虑用前向星来存储边,问题是如何解决正向边与反向边的对应问题呢?可以在边的结构体中记录成对的边,排序后进行顺序查找;也可以使用二分查找或者哈希表来寻找各边的反向边是谁。

About

坚决不Copy代码!

本文标签:,,,,,

SSOJ2429骑马修栅栏:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!