代码改变世界

子树同构问题

2011-06-04 15:43  macaroniz  阅读(442)  评论(0)    收藏  举报

大概描述就是在给定树a和树b,判定a是否与b中某棵子树同构。原出题人给的树大小为200。

最开始的想法是用最小表示法来确定树a和树b的结构,然后再通过某种方法进行比较,不过发现由于a的标号与b不一定相同,因为这种想法很快就被否定掉了。

不妨先假设树a的根已经确定,我们知道一棵树的根如果确定的话,那么这棵树的结构也就确定了。换了几个思路后,脑子里冒出了一个完全属于灵光一现的 想法,如果我知道a中某个节点构成的子树在b中所有同构的情况,那么我应该就可以推出a中该节点父亲和哪些节点是同构的。这样用一个简单的dp就可以搞 定。

假设S[i]表示的是a中节点i构成的子树在b中同构的所有情况,数学一点的表达式就是S[i] = {j|以j为根的子树与以i为根的子树同构,i∈A,j∈B},那么S[i] = func(S[son{i}]) ,func函数就是我们下一步要求得关键,最开始我以为仅仅对i的所有儿子对应的S[I]对应的父节点求一个交集就可以搞定,后来发现这种方法是存在 bug的——这种方法只考虑到了儿子节点与父节点之间的相容性,却没有考虑儿子节点与儿子节点之间的相容性,解决的方法也很简单,在父节点和儿子节点之间 求一次匹配即可