首先先给各位看官分享一下题单,接下来的博客将围绕题单顺序展开:
这里就不具体介绍什么是"欧拉回路”了吧:
在我看来,欧拉回路首先分2大类:有向的或者无向的;具体问题具体分析。
板块一:欧拉图的判断:
无向欧拉图:
1.先用并查集合并所有组,如果并查集组数位1,那么ok
2.再看每个点的度数,因为是无向图,就不细分Indeg和outdeg了,统一用degree表示,那么会存在2种情况:即所有的点degree%2=0,这样就是一个"环形欧拉图",即入点=出点;另一种是“线性欧拉图”,即入点!=出点,那么有且仅有2个点,degree%2=1
有向欧拉图的判断:
1.并查集找组数,有且只有1组就ok
2.找每个点的InDeg和OutDeg:存在2种:“环形有向”,所有的点InDeg==OutDeg;“线性有向”:有且仅有2个点InDeg!=Outdeg,且其绝对值之差为1,
版块二:几笔画的问题:
并查集确定有几组,每一组分开讨论
判断入度点,找有几个奇数入度,然后奇数入度/2就行,因为偶数入读可以来回画的
版本三:欧拉回路的输出
原理运用了dfs遍历的情况,回溯的时候存入栈中,推荐用链式前向星去存图。
重点是关于字典序的输出问题:
在处理问题之前,先按要求排好序,找好每条边的起始点s,和终点e的关系,然后确定一共有几条边(此时边的排列已经默认为字典序了),在On去遍历dfs所有边,标记vis。最后回溯完反向出栈即可。
版本四:数位欧拉回路问题
关于数位欧拉回路主要以题单上2个例题为标准,首先确定以0开始,然后通过
to1=(u<<1)&((1<<n)-1)开始去首左移1位
to2=to1+1;
把to1和to2看成对于的十进制数,用vis去标记是否访问过,最后dfs完,也是反向回溯输出的。