• 欧拉路径


    欧拉图

    定义:

            欧拉回路:图G的一个回路,如果恰通过图G的每一条边,则该回路称为欧拉回路,具有欧拉回路的图称为欧拉图。欧拉图就是从图上的一点出发,经过所有边且只能经过一次,最终回到起点的路径。

            欧拉通路:即可以不回到起点,但是必须经过每一条边,且只能一次。也叫"一笔画"问题。

    性质:

      欧拉回路:一个欧拉回路,删掉一个点,仍然是一个欧拉回路。从一个欧拉回路拖走一个小欧拉回路,结果也是一个欧拉回路。

    判定(充要):

      欧拉回路:1:  图G是连通的,不能有孤立点存在。

           2:  对于无向图来说度数为奇数的点个数为0;对于有向图来说每个点的入度必须等于出度。

      欧拉通路:1:  图G是连通的,无孤立点存在。

           2:  对于无向图来说,度数为奇数的的点可以有2个或者0个,并且这两个奇点其中一个为起点另外一个为终点。对于有向图来说,可以存在两个点,其入度不等于出度,其中一个出度比入度大1,为路径的起点;另外一个入度比出度大1,为路径的终点。

      求解欧拉通路,常规方法是暴搜。

     1 void DFS(int v){//深度优先遍历
     2     for(int i=0;i<graph[v].size();++i){//遍历该点能到达的结点
     3         int w=graph[v][i];
     4         if(!visit[v][w]){//该边没有被访问过
     5             visit[v][w]=visit[w][v]=true;//该边已被访问
     6             DFS(w);//递归遍历
     7         }
     8     }
     9     path.push_back(v);//加入欧拉路径中
    10 }

    注意要等所有的边遍历完再将节点push,否则一旦一条边走错了那答案就错了。这样的话有了’反悔‘得机会。

    (以下讨论无向图)

    对于欧拉回路而言,内部无奇度顶点,随便走都可以。

    对于欧拉通路,找到两个奇度顶点,不妨设为S和E:

     不难发现M1,M2都有欧拉回路,所以S进入到M1/M2时一定可以返回S,但是一旦进入M3就无法回去了,为了避免这种情况,所以要等遍历完所有边再push点,这样可以保证E会是最先push进去的。

  • 相关阅读:
    c++ ShellExecuteEx调用java打包的exe程序
    麻省理工学院公开课-第四讲:快速排序 及 随机化 算法
    Win10的IIS与以前版本的一个区别
    干就行了!!!写程序就像珊瑚,分支太多,哪有那么多复用!
    NPoco的使用方法
    为什么前端要写标准代码?
    对于委托、事件、观察者模式最一目了然的代码段
    delphi处理消息的几种方式
    哎呀妈呀,吓死我了,幸好服务器没崩溃。
    Delphi的Hint介绍以及用其重写气泡提示以达到好看的效果
  • 原文地址:https://www.cnblogs.com/zzqc/p/12167655.html
Copyright © 2020-2023  润新知