zoukankan      html  css  js  c++  java
  • 欧拉回路(附模板)

     
    欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。   判断欧拉路是否存在的方法 有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。 无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。 判断欧拉回路是否存在的方法 有向图:图连通,所有的顶点出度=入度。 无向图:图连通,所有顶点都是偶数度。

    求欧拉回路的Fleury算法

       设G为欧拉图,一般说来G中存在若干条欧拉回路,下面是求欧拉回路的Fleury算法:

    Fleury算法:

    (1)任取v0∈V(G),令P0=v0;(如果是求欧拉路,则:1.无向欧拉路选那两个奇数度的点;2.有向欧拉路选出度大入度1的点)

    (2)设Pi=v0e1v1e2...eivi已经行遍,按下面方法来从E(G)-{e1,e2,...,ei}中选

         取ei+1:

        (a)ei+1与vi相关联;

        (b)除非无别的边可供行遍,否则ei+1不应该为Gi=G-{e1,e2,...,ei}中的桥.(每搜到一个边便删掉)

    (3)当(2)不能再进行时,算法停止。

    可以证明,当算法停止时所得简单回路Pm=v0e1v1e2...emvm(vm=v0)为G中的一条欧拉回路。

     

    C++模版:

     
    // 求欧拉回路或欧拉路,邻接阵形式,复杂度o(n^2)
    //返回路径长度,path返回路径(有向图是得到的是反向路径)
    //传入图的大小n和邻接阵mat,不相交邻点边权0
    //可以有自环与重边,分为无向图和有向图
    #define MAXN 100 
    
    
    void find_path_u(int n,int mat[][MAXN],int now,int& step,int* path)
    {
      int i; 
      for (i=n-1;i>=0;i--) 
        while (mat[now][i])
        { 
          mat[now][i]--,mat[i][now]--; 
          find_path_u(n,mat,i,step,path); 
        } 
      path[step++]=now; 
    }
    
    
    void find_path_d(int n,int mat[][MAXN],int now,int& step,int* path)
    { 
      int i; 
      for (i=n-1;i>=0;i--) 
        while (mat[now][i])
        { 
          mat[now][i]--; 
          find_path_d(n,mat,i,step,path); 
        } 
      path[step++]=now; 
    }
    
    
    int euclid_path(int n,int mat[][MAXN],int start,int* path)
    { 
      int ret=0; 
      find_path_u(n,mat,start,ret,path); 
      // find_path_d(n,mat,start,ret,path); 
      return ret; 
    }
    
      练习题:    1 HDU 3018 Ant Trip    一笔画问题,无向图欧拉路或者欧拉回路,注意题目说了,如果是孤立点,则不用考虑。    2 POJ 1041 John's trip   3 POJ 1386 Play on Words     貌似很经典的模型了,应该叫 单词接龙吧。     本题要求判断是否有 有向图欧拉路   4 POJ 2230 Watch Cow      题目描述每条路必须走两次,且方向不同,其实一样了,有向图的欧拉回路 不过需要输出的是路径中的节点。   5 POJ 2513 Colored Sticks     比较简单,判定是否存在 无向图欧拉路   6 POJ 2337 Catenyms       还是单词 首尾相连,要求判断,然后输出字典序最小的      7 POJ 1392 Ouroboros Snake http://blog.csdn.net/yueashuxia/archive/2010/07/12/5729878.aspx     这里涉及到DeBruijin图     本题要求 按顺序输出 组成的数字。 8 HDU 2894 DeBruijin   同上,这次要输出串
    举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
  • 相关阅读:
    stringstream用法
    C# WinForm设置窗口无边框、窗口可移动、窗口显示在屏幕中央、控件去边框
    C# WinForm设置窗口大小不可调,取消最大、最小化按键
    LeetCode 105. Construct Binary Tree from Preorder and Inorder Traversal 由前序和中序遍历建立二叉树 C++
    LeetCode 106. Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树 C++
    LeetCode 112. Path Sum 二叉树的路径和 C++
    LeetCode 101. Symmetric Tree 判断对称树 C++
    LeetCode 100. Same Tree 判断两棵二叉树是否相等 C++
    C# winform三种方法判断文本框textBox内容是否为空
    LeetCode 145. Binary Tree Postorder Traversal 二叉树的后序遍历 C++
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/4113962.html
Copyright © 2011-2022 走看看