欧拉回路

1. 欧拉通路、欧拉回路、欧拉图
无向图:
1) 设G是连通无向图,则称经过G的每条边一次并且仅一次的路径为欧拉通路;
2) 如果欧拉通路是回路(起点和终点是同一个顶点),则称此回路为欧拉回路(Euler circuit);
3) 具有欧拉回路的无向图G称为欧拉图(Euler graph)。
有向图:
1) 设D是有向图,D的基图连通,则称经过D的每条边一次并且仅一次的有向路径为有向欧拉通路;
2) 如果有向欧拉通路是有向回路,则称此有向回路为有向欧拉回路(directed Euler circuit);
3) 具有有向欧拉回路的有向图D称为有向欧拉图(directed Euler graph)。

2. 定理及推论

欧拉通路和欧拉回路的判定是很简单的,请看下面的定理及推论。
定理5.1 无向图G存在欧拉通路的充要条件是:G为连通图,并且G仅有两个奇度结点(度数为奇数的顶点)或者无奇度结点。
推论5.1:

1) 当G是仅有两个奇度结点的连通图时,G的欧拉通路必以此两个结点为端点。
2) 当G是无奇度结点的连通图时,G必有欧拉回路。
3) G为欧拉图(存在欧拉回路)的充分必要条件是G为无奇度结点的连通图。

定理5.2 有向图D存在欧拉通路的充要条件是:
D为有向图,D的基图连通,并且所有顶点的出度与入度都相等;或者除两个顶点外,其余顶点的出度与入度都相等,而这两个顶点中一个顶点的出度与入度之差为1,另一个顶点的出度
与入度之差为-1。
推论5.2:
1) 当D除出、入度之差为1,-1的两个顶点之外,其余顶点的出度与入度都相等时,D的有向欧拉通路必以出、入度之差为1的顶点作为始点,以出、入度之差为-1的顶点作为终点。
2) 当D的所有顶点的出、入度都相等时,D中存在有向欧拉回路。
3) 有向图D为有向欧拉图的充分必要条件是D的基图为连通图,并且所有顶点的出、入度都相等。

3. 欧拉回路的应用

  • 哥尼斯堡七桥问题
  • 一笔画问题。
  • 旋转鼓轮的设计

欧拉回路最著名的有三个应用,大家可以网上百度一下,这里不详述。

4.怎样判断一个图是否存在欧拉回路

判断欧拉回路是否存在的方法

有向图:图连通,所有的顶点出度=入度。

无向图:图连通,所有顶点都是偶数度。

void print(int u){
     for (int i=1;i<=50;i++){
        if(tu[u][i]){
            tu[u][i]--;
            tu[i][u]--;
            print(i);
            printf("%d %d\n",i,u);
        }
     }
}

scanf("%d",&n);
        for (int i=1;i<=n;i++){
            scanf("%d %d",&u,&v);
            du[u]++;
            du[v]++;
            tu[u][v]++;
            tu[v][u]++;
        }
        int j;
        for (j=1;j<=50;j++){
            if(du[j]%2) break;
        }
        if(j<=50) printf("some beads may be lost\n");
        else {
            for (int i=1;i<=50;i++)
                print(i);
        }

输出欧拉路径时使用dfs,先序(逆序)输出

posted @ 2018-01-02 19:06  lmjer  阅读(240)  评论(0编辑  收藏  举报