欧拉回路 - 杂录

本文探讨了18世纪的七桥问题及其解决方案,该问题由数学家欧拉转化为一笔画问题。文中介绍了连通图一笔画的充要条件,并提供了C++代码实现深度优先搜索(DFS)和广度优先搜索(BFS)求解欧拉路径和欧拉回路的方法。内容涉及图论基础和算法应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

杂谈笔记欧拉回路

18世纪初普鲁士的哥尼斯堡,有一条河穿过,河上有两个小岛,有七座桥把两个岛与河岸联系起来(如概述图)。有个人提出一个问题:一个步行者怎样才能不重复、不遗漏地一次走完七座桥,最后回到出发点。后来大数学家欧拉把它转化成一个几何问题——一笔画问题。他不仅解决了此问题,且给出了连通图可以一笔画的充要条件是:奇点的数目不是0个就是2个(连到一点的数目如是奇数条,就称为奇点,如果是偶数条就称为偶点,要想一笔画成,必须中间点均是偶点,也就是有来路必有另一条去路,奇点只可能在两端,因此任何图能一笔画成,奇点要么没有要么在两端)

转载于
https://baike.baidu.com/item/七桥问题

如果一个图能够一笔画,那么一笔画的路径就叫做欧拉路

如果最后又回到起点,那么这个路径叫做欧拉回路

C++代码:

void dfs(int i, int s)
{
    p[s] = i;
    if(s == m + 1)
    {
        print();
        return ;
    }
    else
    {
        for(int j = 1; j <= n; j ++)
        {
            if(mp[i][j] == false)
            {
                mp[i][j] = mp[j][i] = true;
                dfs(j, s + 1);
                mp[i][j] = mp[j][i] = false;
            }
        }
    }
}

BFS:

void bfs(int i)
{
    int head = 0, tail = 1;
    path[tail] = i;
    pre[tail] = head;
    int j;
    while(head != tail)
    {
        head ++;
        for(int j = 1; j <= n; j ++)
        {
            if(mp[i][j])
            {
                tail ++;
                path[tail] = j;
                pre[tail] = head;
                mp[i][j] = mp[j][i] = false;
                if(head == m)
                {
                    print(tail);
                    return ;	
                }
                break;
            }
        }
        i = j;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值