欧拉回路
欧拉通路: 通过图中每条边且只通过一次,并且经过每一顶点的通路
欧拉回路: 通过图中每条边且只通过一次,并且经过每一顶点的回路
有向图的基图:忽略有向图所有边的方向,得到的无向图称为该有向图的基图。
无向图
设G是连通无向图,则称经过G的每条边一次并且仅一次的路径为欧拉通路;
如果欧拉通路是回路(起点和终点是同一个顶点),则称此回路是欧拉回路
具有欧拉回路的无向图G成为欧拉图
有向图
(1)设D是有向图,D的基图连通,则称经过D的每条边一次并且仅有一次的有向路径为 有向欧拉通路
(2)如果有向欧拉通路是有向回路,则称此有向回路为 有向欧拉回路
(3)具有有向欧拉回路的图D称为有向欧拉图
定理
无向图G存在欧拉通路的充要条件是:G为连通图,并且G仅有两个奇度结点(度数为奇数的顶点)或者无奇度结点。
推论
(1) 当G是仅有两个奇度结点的连通图时,G的欧拉通路必以此两个结点为端点;
(2)当G是无奇度结点的连通图时,G必有欧拉回路
(3)G为欧拉图(存在欧拉回路)的充分必要条件是 G为无奇度结点的连通图
(有向图) 定理
有向图D存在欧拉通路的充要条件是:D为有向图,D的基图连通,并且所有顶点的出度与入度相等;或者 除两个顶点外,其余顶点的出度与入度都相等,而这两个顶点中一个顶点的出度与入度之差为1,另一个顶点的出度与入度之差为-1.
推论
(1)当D除出、入度之差为1,-1的两个顶点之外,其余顶点的出度与入度相等时,D的有向欧拉通路必以出、入度之差为1的顶点作为始点,以出、入度之差为-1的顶点作为终点。
(2)当D的所有顶点的出、入度都相等时,D中存在有向欧拉回路。
(3)有向图D为有向欧拉图的充要条件是 D的基图为连通图,并且所有顶点的出、入度都相等。
下面是一道例题
欧拉回路
//本题为无向图的欧拉回路
//欧拉回路:图连通;图中所有节点度均为偶数
#include<string.h>
#include<stdio.h>
using namespace std;
const int maxn = 1050;
int F[maxn], degree[maxn];
int n, m;
int Find(int x) {
return F[x] == x ? x : F[x] = Find(F[x]);
}
void Join(int x, int y){
int xx = Find(x);
int yy = Find(y);
if(xx != yy)F[xx] = yy;
}//以上是并查集
int main(){
while(scanf("%d", &n) && n != 0){
scanf("%d", &m);
memset(degree, 0, sizeof(degree));
for(int i = 1; i <= n; i++)F[i] = i;
for(int i = 1; i <= m; i++){
int x, y;
scanf("%d %d", &x, &y);
Join(x, y);//并到一起
degree[x]++;
degree[y]++;//度数+1
}
int tmp = Find(1);
int flag = 1;
for(int i = 1; i <= n; i++){
if(degree[i]&1)flag= 0;//若度数为奇数
if(tmp != Find(i))flag = 0;//若图不连通
}
printf("%d\n", flag);
}
return 0;
}