子树同构问题
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的——这种方法只考虑到了儿子节点与父节点之间的相容性,却没有考虑儿子节点与儿子节点之间的相容性,解决的方法也很简单,在父节点和儿子节点之间 求一次匹配即可
浙公网安备 33010602011771号