欧拉回路-骑马修栅栏

#include<iostream>
#include<string.h>
using namespace std;
int f[1050][1050],d[1050],res[1550000];
int n,j=0,k=0,m=0;
void search(int z)  
{
for(int i=1;i<=m;i++)
if(f[z][i]>0)
{f[z][i]--;
f[i][z]--;
search(i);
}
j++;
res[j]=z;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
{ int x,y;
cin>>x>>y;
f[x][y]++;
f[y][x]++;
d[x]++;d[y]++;
m=max(max(x,m),y);
}
for(int i=1;i<=m;i++)
if(d[i]%2!=0) 
{k=i;break;}
if(k==0)
{
for(int i=1;i<=n;i++)
if(d[i])
{k=i;break;}}
search(k);
for(int i=j;i>0;i--)
cout<<res[i]<<endl;
return 0;
}

本渣写的该题的程序。思路大致是剽窃wikioi上本题的某位选手的。

现在,让我来重温思路,加强理解 ,巩固记忆。

f[x][y]++;
f[y][x]++;  这两句很妙,和后面的减减堪称是本算法的点睛之笔(个人拙见,勿喷)。该句话是记录出现过的路径,有的就标为1.而函数中的减减,则是该路已走过一次后,便标为0,使得不会重复走。理解了这一点,该算法便理解大半了。

d[x],d[y]是记录该点一共有几条线(好像叫出线?)来辨认奇度点和偶度点(出线为奇或偶)。

m=max(max(x,m),y);至于这一句,则是在记录出现的点的最大值,确定点的范围。

for(int i=1;i<=m;i++)
if(d[i]%2!=0) 
{k=i;break;}
if(k==0)
{
for(int i=1;i<=n;i++)
if(d[i])
{k=i;break;}}  这一句这是寻找有没有奇度点(不明白奇度点对于欧拉回路的含义可自行百度),有奇度点就记录小的奇度点。没有则记录最小的偶度点。

然后,找到了最小的奇(偶)度点,就可以开始运用函数啦!

void search(int z)  
{
for(int i=1;i<=m;i++)
if(f[z][i]>0)
{f[z][i]--;
f[i][z]--;
search(i);
}
j++;
res[j]=z;
}      从最小的奇(偶)度点开始,寻找点的大小和它最接近的点组成的线,然后再把该线记录为0,避免重复。下面的J++是记录该点出现的第几次数。

用res[]保存。

至于最后面为啥要倒序输出,我还不懂,。等懂了我再来补上。

欢迎高人指点,鄙人实乃新手。

欧拉回路-骑马修栅栏

时间: 2024-10-13 22:27:09

欧拉回路-骑马修栅栏的相关文章

欧拉回路——骑马修栅栏

题目:骑马修栅栏 描述: Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束. 每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个顶点).一个顶点上可连接任意多(>=1)个栅栏.两顶点间可能有多个

洛谷P2731 骑马修栅栏 Riding the Fences

P2731 骑马修栅栏 Riding the Fences• o 119通过o 468提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题解 最新讨论 • 数据有问题题目背景Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方.题目描述John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即

洛谷 P2731 骑马修栅栏 Riding the Fences

P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束. 每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个顶点).一个

luogu P2731 骑马修栅栏 Riding the Fences | 欧拉道路

luogu P2731 骑马修栅栏 Riding the Fences luogu P1341 无序字母对 度数:一个点上连接边的个数 1.欧拉道路:相当于一笔画 无向图:除了两个或没有点为奇点(度数为奇)以外,其余度数均为偶 有向图:只有两个点或没有点入度不等于出度,起点入度=出度-1,终点入度=出度+1 2.欧拉回路: 无向图:奇点个数为0 有向图:所有点出度=入度(起点终点重合) #include<cstdio> #include<iostream> using namesp

codevs 水过 骑马修栅栏

[问题描述] 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束. 每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个顶点).一个顶点上可连接任意多(>=1)个栅栏.所有栅栏都是连通的(也就是你可以从任

2039 骑马修栅栏

2039 骑马修栅栏 USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束. 每一个栅

欧拉路小结 JZYZOJ1210 骑马修栅栏

现在写到欧拉路,理解起来并不算特别困难...吧... 但是非常恶心的是每次都要调试半天,做不到一遍两遍就能ac 每次写程序都对于程序的整体构架没有清晰的思路,想到哪里写到哪里真的是个非常差的习惯[尽管在写不出来的时候非常有用],所以快点改掉吧. 似乎也没有什么特别困难的部分,相关的题在oj上是p1209-p1211 数组一定要记得稍微开大一点,不要顺手就打一个数据范围上去,很初级也很常见的错误 应该深入理解一下dfs之后记录的作用,但是我到现在还不理解 以p1210为例 ☆骑马修栅栏      

洛谷P2731骑马修栅栏

题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束. 每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个顶点).一个顶点上可连接任意多(>=1)个栅栏.两顶点间可能有多个栅栏.

codevs 2039 骑马修栅栏 USACO x

我承认我是转的@自为风月马前卒 嘿~ 题目描述 Description Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束. 每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个顶点).一个顶点上可