一点关于欧拉回路的总结

对于著名的七桥问题:

1736年29岁的欧拉向圣彼得堡科学院递交了《哥尼斯堡的七座桥》的论文,在解答问题的同时,开创了数学的一个新的分支——图论几何拓扑,也由此展开了数学史上的新历程。

七桥问题提出后,很多人对此很感兴趣,纷纷进行试验,但在相当长的时间里,始终未能解决。欧拉通过对七桥问题的研究,不仅圆满地回答了哥尼斯堡居民提出的问题,而且得到并证明了更为广泛的有关一笔画的三条结论,人们通常称之为“欧拉定理F”。

(以上摘自百度百科)

欧拉首先把上图左边的七桥问题用图论的语言改写成了右边的,则问题变成了:能否从无向图中的一个结点出发走出一条道路,每条边恰好经过一次。这样的路线被称为欧拉道路(eulerian path),也可以形象地称为“一笔画”。

不难发现,在欧拉道路中,“进”与“出”是相对的,对于几乎每一个节点来说,进的数量必须等于出的数量,而只有起点和终点有的时候进出数量可以不同。

换句话说,除了起点和终点外,其他点的度数(degree)应该是偶数

由此可以得出无向图中存在欧拉道路的充分条件:

1,无向图是连通的

2,最多只有两个奇点(度数为奇数的点)(实际上奇点数量只能是偶数),且如果有两个奇点,则必须从其中一个奇点出发,另一个奇点终止;如果奇点不存在,则可以从任意点出发,最终一定会回到该点(被称为欧拉回路)

相应可以推出有向图中存在欧拉道路的充分条件:

1,有向图在忽略道路方向时是连通的

2,最多只有两个点的入度不等于出度,而且其中一个点的出度恰好比入度大1(起点),另一个点的入度恰好比出度大1(终点)

(实际上当只有两个点出入度不相等的时候,只要判断二者的出入度恰好差1就可以了)

以下代码用于打印欧拉道路或者欧拉回路(逆序):

void euler(int u){
    for(int v = 0; v < n; v++) if(G[u][v] && !vis[u][v]){
        vis[u][v] = vis[u][v] = 1;//vis[u][v] = 1; 注释的这个语句是有向图用的
        euler(v);
        printf("%d %d\n", u, v);
    }
    //G代表是否可走,vis代表是否走过,且二者都是全局变量
}//逆序打印,且为欧拉道路的时候,第一次调用的时候传的值得是起点

而对于判断连通的时候,可以用dfs进行判断,也可以用并查集判断

对于判断奇点或出入度的时候,只需要一两个全局数组来记录,然后判断就可以了

练习题:Play on Words - UVA 10129 - Virtual Judge (vjudge.net)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值