欧拉回路

对于给定的图G,如果从某个结点出发走一条道路,使得它恰好通过G的每一条边恰好一次,该路径成为欧拉道路。如果该路径起点终点相同,那么成为欧拉回路(可见,欧拉回路是特殊的欧拉道路)。这也是一笔画问题。

不同的图,欧拉道路和回路的判断条件也不同,当然图都必须是连通图。如果是有向图,存在欧拉道路的条件是没有或者只有两个入度不等于出度的点,并且必须是一个点的出度比入度大一(欧拉道路的起点),一个点的入度比出度大一(欧拉道路的终点);如果所有的点入度等于出度,就是欧拉回路了。 而对于无向图,存在欧拉道路的条件是没有或者只有两个奇点,并且必须从一个奇点出发,另一个奇点结束;如果所有点度数均为偶数,则为欧拉回路。

当确定之后,需要打印出欧拉道路,可利用dfs搜索将走过的边压栈。

//适用于无向图
void euler(int u)
{
    for(int v=1; v<=n; v++)
    {
        if(G[u][v])
        {
            G[u][v]--;
            G[v][u]--;//如果是有向图,该句去掉
            euler(v);
            //压栈
            Edge tmp;
            tmp.u = u;
            tmp.v = v;
            Stack.push(tmp);
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值