定理
无向图G具有一个欧拉路,当且仅当G是连通的,并且有0个或者是2个奇数度节点。
定理简要证明
必要性:
可以先将G的节点、路径编号。记为
v
1
,
v
2
,
v
3
,
.
.
.
v
n
v_{1},v_2,v_3,...v_n
v1,v2,v3,...vn ,
e
1
,
e
2
,
.
.
.
,
e
n
e_1,e_2,...,e_n
e1,e2,...,en
假设G具有欧拉路,那么G必然是连通的,不妨假设从
v
1
,
e
1
v_1,e_1
v1,e1开始存在点边序列。对于序列中的任意一个非端点节点,可以重复出现,那么对于这个无向图来说这个节点的度数必然是偶数个,对于端点如果
v
1
=
v
n
v_1=v_n
v1=vn有0个奇数度节点,反之有两个。
充分性:
如果是有两个奇数的度节点,不妨假设为
v
1
,
v
n
v_1,v_n
v1,vn,从其中一个的一个节点出发开始构造一这个点边序列,因为这个G是连通的,与
v
1
v_1
v1连接的节点
v
2
v_2
v2的度数如果是偶数,必然可以继续构造路径,每一个
e
j
e_j
ej ,
j
=
1
,
2
,
3..
n
j=1,2,3..n
j=1,2,3..n只会出现一次,最后就只剩下一个奇数的节点了。如果是没有奇数的节点,同样假设是由
v
1
v_1
v1出发的,必然可以回到
v
1
v1
v1 ,但并不一定最大的点边序列,记为L1 ,如果没有经过所有的,那么在剩下的路径组成的图中,必然有节点重合通过得到L1 的方法得到L2,如果L1+L2经过了所有的节点那么得到了欧拉路,如果没有,可以重复L1,L2的操作继续进行 ,最终可以得到欧拉路。
推论
无向图G有一条欧拉回路当且仅当G是连通的,并且所有的节点的度数全为偶数。
算法实现
这个是对欧拉回路的判断。
#include<iostream>
using namespace std;
int in_out_degree[1001]={0};
int v[1001][1001];
int visited[1001];
int mycount=0;
void dfs(int a,int number){
visited[a]=1;
mycount++;
//确定
for(int i=1;i<=number;i++){
if(v[a][i]==1 &&visited[i]==0){
dfs(i,number);
}
}
}
int main(){
int number;int m,b,c;
cin>>number>>m;
for(int i=0;i< m;i++){
cin>>b>>c;
v[b][c]=v[c][b]=1;
in_out_degree[b]++;
in_out_degree[c]++;
}
dfs(1,number);
int flag=1;
if(mycount<number)
flag=0;
for(int i=1;i<=number;i++){
if(in_out_degree[i]%2==1)
{
// cout<<"is" <<in_out_degree[i]<<endl;
flag=0;
break;
}
}
//cout<<mycount<<endl;
if(flag==1)
cout<<1<<endl;
else
cout<<0<<endl;
return 0;
}