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,先序(逆序)输出