zoukankan      html  css  js  c++  java
  • 【学习】欧拉回路

    (摘自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);
            }
        }
    }
  • 相关阅读:
    动态规划 简单的分割问题的解决方案钢棒
    SICP 1.20经验
    辛星一起了解下后续PHP性能功能
    汽车之家购买价格PC真正的原因阿拉丁
    可怜,的分母。
    [ACM] poj 1064 Cable master (二进制搜索)
    从Access创建Sqlite数据库
    变化的阅读程序猿自学习
    ArcEngine载入中SDE问题栅格数据
    pinyin4j新手教程
  • 原文地址:https://www.cnblogs.com/jian-song/p/11644230.html
Copyright © 2011-2022 走看看