欧拉回路的判断

定理

无向图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 e1e2,...,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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值