4644. 【NOI2016模拟7.16】人生的经验——欧拉回路

本文介绍了一种利用欧拉回路解决特定字符串连接问题的方法,并详细解释了欧拉回路及其求解算法——圈套圈算法的原理与步骤。

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

这一题的第一个答案就是n*c+l-1(也就是说任意两个相邻的字符串都可以共用l-1个字符),证明如下:

我们首先列出c^(l-1)个点,代表c^(l-1)种字符串的前缀,然后我们又把每一个点连出c条边,代表连向字符串的后缀。举个例子:

abcd分别连向

bcda

bcdb

bcdc

bcdd

(上面的后l-2个要与下面的前l-2个相同,两个字符串分别表示一个长度为l的字符串的前l-1个与后l-1个,连边的权值为后一个字符串的最后一个字母),由于每一个点都有c条出边于入边,所以这个图一定会有一条欧拉回路,那么就证明了命题。

关键是怎样求欧拉回路。并且在此拓展一下有关欧拉回路的问题。

欧拉回路:从一个点开始,每一条边都恰好经过一次地回到起点

欧拉路径:从一个点开始,每一条边都恰好经过一次地在任意点结束

对于有向图,若每一个点的入度等于出度,则存在欧拉回路。

                    若所有点的度数都一样,或有两个点一个多1一个少1,那么有欧拉路径

对于无向图,若所有的点的度数都是偶数,那么存在欧拉回路

                     若有0或2个点的度数为奇数,那么存在欧拉路径

欧拉回路的求法之一:圈套圈算法

         步骤如下

          1、从任意点i开始,找到一个任意的环p0p1p2...pt(p0=pt=i),并把pj作为待搜索点

     2、从任意pj开始,用1的方式找还环g0g1g2...gh(g0=gh=pj),那么g便可以插入p中,变成p0p1...pjg1g2...ghpj+1pj+2...pt

          3、重复刚才的步骤,最终便可以找出欧拉回路了

时间复杂度O(边数)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值