首先膜一下vfk领先全球的动态仙人掌栽培技术…
然后谢谢Time-Machine学长在暑假集训时候讲了仙人掌DP.
然后感觉听得并不是很懂…所以再来对着论文学一遍顺便写一写例题代码
这一篇主要先学仙人掌的基础(定义和性质什么的)
————————————线 割 分 是 我 >w<———————————————–
什么是仙人掌?
仙人掌是不含自环的,一条边最多属于一个简单环的无向连通图.
从定义不难看出树其实也是仙人掌的一种,也就是说这几个概念的关系大概是:
树是一种特殊的仙人掌,仙人掌是一类特殊的无向连通图.
从图片来观察一下.
这也是个仙人掌↓
那么我们现在就知道怎样来区分仙人掌和非仙人掌了
对于树我们都很熟悉,那么能不能想办法把仙人掌看成一棵树呢?
办法是有的.仙人掌上最讨厌的就是环.但是我们注意到仙人掌上不可能存在环与其他环有重边,这就好办了,我们可以把环看成类似树上的节点的东西,只是这个节点包含了更大的信息量.(注意只是类似,和真正树上的节点是不一样的!)
仿照树相关的定义,我们可以对仙人掌定义仙人掌上的节点的父亲和环的父亲.
对于仙人掌上的节点,它的父亲是可能存在多种可能的.如果它到根的路径上与它相邻的是一条简单路径而不是环,那么这个节点的父亲和平常树上节点的父亲是没什么区别的, 它的父亲是它到根的简单路径上经历的第二个点.那么如果它到根节点路径上与它相邻的是个环,则将其到根的路径上经历的第一条边所在的环当做其父亲.
对于环,我们将它的父亲定义为一个环上离根最近的点.
相对的那么就出现了儿子关系了.
对于仙人掌上的节点,它的儿子显然可以是环可以是普通节点.
但是对于环的儿子,则是环上除掉这个环的父亲以外的其他所有节点.
区别于普通树,对仙人掌而言环上的节点除了父亲之外还存在父亲节点和母亲节点(为什么要起这种名字好容易搞混啊…)
环上节点的父亲节点和母亲节点指这个点在环上相邻的那两个点.
(一定不要搞混啦>_<)
怎样进行仙人掌的遍历和节点信息的确定呢?
依然是从根节点开始DFS.
如果我们将要访问一个节点,而这个节点之前还没有被访问过,那么我们直接把这个节点的父亲设为当前节点就行了.(从环和节点的父亲的定义上看这样显然没问题)
那么如果我们将要访问的那个节点已经被访问过了呢?显然这时候出现了环.
那么就有两种情况:
现在我们假设我们正在访问的节点为x,将要访问的那个节点为y
那么如果x的第一次被访问时间比y早,那么这证明y所在的环已经被我们访问过了,就不需要再单独对y处理什么.
如果x的第一次被访问时间比y晚,则说明x在一个以y为父亲的环上,此时再遍历整个环标记一下父亲节点母亲节点.
至此,整个仙人掌遍历完成,同时仙人掌上所有节点的父子父母信息都已经处理了出来.
版权声明:本文为博主原创文章,未经博主允许不得转载。