欧拉路径 - 骑马修栅栏 Riding the Fences - 洛谷 P2731
发布日期:2021-05-07 20:01:59 浏览次数:17 分类:原创文章

本文共 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 1F1024,1i,j500

输入样例:

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;}
上一篇:欧拉路径/并查集 - Play on Words - POJ 1386
下一篇:欧拉回路(输出路径) - 欧拉回路 - AcWing 1184

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月14日 23时45分45秒