欧拉路径

今天终于稳下来好好学了学欧拉路径,怕自己后面忘了,来大概记录一下

(以下全为个人口糊,目的是让自己后面忘了知识点来复习一下,所以可能有些地方不太对,欢迎大家指错)

欧拉路径指的是一种把图中所有边都走一遍且不重复的走法

欧拉回路指的是一个图中的欧拉路径的起点和终点为同一个点

然后大概是一些特性:

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.遇到同样知识点不会的题注意转化,动脑子最重要(确信)

目前只想写这些,有想起来的重要东西之后再补充。

posted @ 2022-08-05 18:04  dgdger  阅读(249)  评论(0编辑  收藏  举报