模板欧拉回路(一笔画问题)

Posted jian-song

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板欧拉回路(一笔画问题)相关的知识,希望对你有一定的参考价值。

(摘自https://www.cnblogs.com/abc1604831024/p/9077112.html

 

欧拉回路就是给一个图,存在一条回路把所边经过且每条边只经过一次

对于无向图

  存在欧拉回路的条件:每个点的度都为偶数

  存在欧拉路的条件:有且只有两个点的度为一,且这两个点分别为起点和终点

对于有向图

  存在欧拉回路的条件:每个点出度等于入度

  存在欧拉路的条件:存在一个点出度比入度多一作为起点,存在一点入度比出度多一作为终点,其余点出度等于入度

求欧拉回路的方法——基本(套圆)法

  dfs搜索,不能再往下走便回溯,回溯时记录路径,回溯时不清除对边的标记,最后求出来的路径就是欧拉回路。

举例

技术图片

 

 

 

 

 

(1)走<1,2>,<2,3>,<3,4>,<4,5>,<5,1>,然后无路可走,就回溯记录下回溯路径<1,5>,<5,4>,4点有其它路壳走。

(2)<4,8>,<8,3>,<3,6>,<6,7>,<7,2>,<2,4>,无路可走,然后回溯<1,5>,<5,4>,<4,2>,<2,7>,<7,6>,<6,3>,<3,8>,<8,4>,<4,3>,<3,2>,<2,1>。

记录下的路径<1,5>,<5,4>,<4,2>,<2,7>,<7,6>,<6,3>,<3,8>,<8,4>,<4,3>,<3,2>,<2,1>便是一条欧拉回路。

 

(摘自https://www.cnblogs.com/fzl194/p/9578791.html)

 

模板

无向图+重边+逆序输出(正序压入栈即可)

void euler(int u)
{
    for(int v = 1; v <= n; v++)
    {
        if(Map[u][v])
        {
            Map[u][v]--, Map[v][u]--;
            euler(v);
            cout<<u<<" "<<v<<"
";
        }
    }
}

无向边+无重边

void euler(int u){
    for(int v=0;v<n;v++){
        if(G[u][v]&&!vis[u][v]){
            vis[u][v]=vis[v][u]=1;
            euler(v);
            printf("%d %d
",u,v);
        }
    }
}

有向图+无重边

void euler(int u){
    for(int v=0;v<n;v++){
        if(G[u][v]&&!vis[u][v]){
            vis[u][v]=1;
            euler(v);
            printf("%d %d
",u,v);
        }
    }
}

 

以上是关于模板欧拉回路(一笔画问题)的主要内容,如果未能解决你的问题,请参考以下文章

欧拉回路,一笔画问题

欧拉图简述---(一笔画问题)

1341:例题一笔画问题

一笔画问题

Learning 欧拉回路的求解

计蒜客 | 欧拉回图 | 判断欧拉回路