
本文共 1719 字,大约阅读时间需要 5 分钟。
欧拉路径 - 骑马修栅栏 Riding the Fences - 洛谷 P2731
农民John每年有很多栅栏要修理。
他总是骑着马穿过每一个栅栏并修复它破损的地方。
John是一个与其他农民一样懒的人。
他讨厌骑马,因此从来不两次经过一个栅栏。
你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次。
John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束。
每一个栅栏连接两个顶点,顶点用 1 到 500 标号(虽然有的农场并没有 500 个顶点)。
一个顶点上可连接任意多( ≥1 )个栅栏。
所有栅栏都是连通的(也就是你可以从任意一个栅栏到达另外的所有栅栏)。
你的程序必须输出骑马的路径(用路上依次经过的顶点号码表示)。
我们如果把输出的路径看成是一个500进制的数,那么当存在多组解的情况下,输出500进制表示法中最小的一个 (也就是输出第一个数较小的,如果还有多组解,输出第二个数较小的,等等)。
输入数据保证至少有一个解。
输入格式
第 1 行:一个整数 F,表示栅栏的数目;
第 2 到 F+1 行:每行两个整数 i,j 表示这条栅栏连接 i 与 j 号顶点。
输出格式
输出应当有 F+1 行,每行一个整数,依次表示路径经过的顶点号。
注意数据可能有多组解,但是只有上面题目要求的那一组解是认为正确的。
数据范围
1 ≤ F ≤ 1024 , 1 ≤ i , j ≤ 500 1≤F≤1024, 1≤i,j≤500 1≤F≤1024,1≤i,j≤500
输入样例:
91 22 33 44 24 52 55 65 74 6
输出样例:
1234254657
分析:
输 出 具 体 欧 拉 路 径 。 输出具体欧拉路径。 输出具体欧拉路径。
注意:
本 题 点 数 较 少 , 用 邻 接 矩 阵 存 储 图 , 本题点数较少,用邻接矩阵存储图, 本题点数较少,用邻接矩阵存储图,
每 遍 历 过 一 条 边 就 删 去 一 条 。 每遍历过一条边就删去一条。 每遍历过一条边就删去一条。
起 点 应 当 优 先 选 择 度 数 为 奇 数 的 点 , 同 时 要 避 开 孤 立 点 。 起点应当优先选择度数为奇数的点,同时要避开孤立点。 起点应当优先选择度数为奇数的点,同时要避开孤立点。
代码:
#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int N=510, M=1100;int n=500,m;int g[N][N];int d[N];int ans[M],cnt;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=0;i<m;i++) { int a,b; cin>>a>>b; d[b]++,d[a]++; g[a][b]++,g[b][a]++; } int start=1; while(!d[start]) start++; //防止孤立点 for(int i=1;i<=n;i++) //若存在入度为奇数的点,从该点进入搜索 if(d[i]%2) { start=i; break; } dfs(start); for(int i=cnt;i;i--) cout<<ans[i]<<endl; return 0;}
发表评论
最新留言
关于作者
