企业门户网站建设方案后台管理,招聘网站上找在家做,官方网站开发公司排名,揭阳自助建站软件农民John每年有很多栅栏要修理。
他总是骑着马穿过每一个栅栏并修复它破损的地方。
John是一个与其他农民一样懒的人。
他讨厌骑马#xff0c;因此从来不两次经过一个栅栏。
你必须编一个程序#xff0c;读入栅栏网络的描述#xff0c;并计算出一条修栅栏的路径#xf…农民John每年有很多栅栏要修理。
他总是骑着马穿过每一个栅栏并修复它破损的地方。
John是一个与其他农民一样懒的人。
他讨厌骑马因此从来不两次经过一个栅栏。
你必须编一个程序读入栅栏网络的描述并计算出一条修栅栏的路径使每个栅栏都恰好被经过一次。
John能从任何一个顶点(即两个栅栏的交点)开始骑马在任意一个顶点结束。
每一个栅栏连接两个顶点顶点用 1 到 500 标号(虽然有的农场并没有 500 个顶点)。
一个顶点上可连接任意多( ≥1 )个栅栏。
所有栅栏都是连通的(也就是你可以从任意一个栅栏到达另外的所有栅栏)。
你的程序必须输出骑马的路径(用路上依次经过的顶点号码表示)。
我们如果把输出的路径看成是一个500进制的数那么当存在多组解的情况下输出500进制表示法中最小的一个 (也就是输出第一个数较小的如果还有多组解输出第二个数较小的等等)。
输入数据保证至少有一个解。
输入格式
第 1 行:一个整数 F表示栅栏的数目;
第 2 到 F1 行:每行两个整数 i,j 表示这条栅栏连接 i 与 j 号顶点。
输出格式
输出应当有 F1 行每行一个整数依次表示路径经过的顶点号。
注意数据可能有多组解但是只有上面题目要求的那一组解是认为正确的。
数据范围
1≤F≤1024 1≤i,j≤500
输入样例
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
解析
求最小字典序的欧拉路径的方法
#includeiostream
#includestring
#includecstring
#includecmath
#includectime
#includealgorithm
#includeutility
#includestack
#includequeue
#includevector
#includeset
#includemath.h
#includemap
#includesstream
#includedeque
#includeunordered_map
#includeunordered_set
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pairint, int PII;
const int N 5e2 5, M 2e3, INF 0x3f3f3f3f;
int n500,m;
int g[N][N];
int ans[M], cnt;
int d[N];void dfs(int u) {for (int i 1; i n; i) {if (g[u][i]) {g[u][i]--, g[i][u]--;dfs(i);}}ans[cnt] u;
}int main() {cin m;for (int i 1, a, b; i m; i) {cin a b;g[a][b], g[b][a];d[a], d[b];}int s 1;while (!d[s])s;for (int i 1; i n; i) {if (d[i] % 2) {s i;break;}}dfs(s);for (int i cnt; i 0; i--)printf(%d\n, ans[i]);return 0;
}