欧拉路径
今天终于稳下来好好学了学欧拉路径,怕自己后面忘了,来大概记录一下
(以下全为个人口糊,目的是让自己后面忘了知识点来复习一下,所以可能有些地方不太对,欢迎大家指错)
欧拉路径指的是一种把图中所有边都走一遍且不重复的走法
欧拉回路指的是一个图中的欧拉路径的起点和终点为同一个点
然后大概是一些特性:
1.有向图中的欧拉路径(非欧拉回路)的起点出度比入度多一,终点入度比出度多一。
2.有向图中的欧拉回路中每个点的出度和入度都相等,任一点都可以作为起点和终点。
3.无向图中的欧拉路径(非欧拉回路)的起点和终点的度为奇数,其余点的度为偶数。
4.无向图中的欧拉回路所有点的度都为偶数,任一点都可以作为起点和终点。
程序中的一些流程:
1.判断是否存在欧拉路径(遍历标记是否为欧拉回路,判断如果不是欧拉回路而点的度数又不符合上面的特性即为不存在)
2.存在的话是否是欧拉回路
3.不是欧拉回路则找起点(终点不重要),是欧拉回路时起点一般为字典序最小的点
4.dfs找欧拉路径
需要注意的点:
1.可以用邻接矩阵或邻接表,邻接矩阵更费时间和空间,邻接表建议用vector,很方便
2.用邻接表(有向图)时dfs中的代码be like:
void dfs(int idx){ for(int i=d[idx];i<=ver[idx].size();i=d[idx]){ d[idx]=i+1;//标记从idx发出的边 防止重复遍历 dfs(i); } s.push(idx);//用栈存路径 }
3.用邻接矩阵(无向图)时dfs中的代码be like:
void dfs(int idx){ for(int i=1;i<=n;i++){//遍历一遍,n为点的个数 if(hh[idx][i]>0){ hh[idx][i]--; hh[i][idx]--;//因为是无向图,所以一条无向边被走过其实是两条有向边被走过 dfs(i); } } s.push(idx);//用栈存路径 }
4.遇到同样知识点不会的题注意转化,动脑子最重要(确信)
目前只想写这些,有想起来的重要东西之后再补充。