cf 0-1-Tree
http://codeforces.com/contest/1156/problem/D
一棵树,边权只能为0或者1。一条简单路径就是类似01001100的样子。现要求简单路径中,0不能接在1后面。问其数量。
首先想到的是树形dp,哎,脑子里的工具或者类比问题太少了。
dp的机制:知道儿子树的所有答案,求当前树的答案。其实能做:增加了当前根之后,增加的路径就是通过了当前根的路径,它到儿子的路是1那么称这些儿子为1儿子,另外的是0儿子。那么0儿子间俩俩相乘再x2,1儿子间也是,然后0儿子和1儿子间彼此相乘但是不x2。可是还有以这个根为端点的呢?这个就难搞了,总之很复杂?
复杂,可是自己也不知道最终算法是这个的简化版本还是另辟蹊径对不?
换一个机制:全0路径和全1路径容易求得。现在求01路径:01路径必有一个中轴点从0到1。那么对于一个点来说,它通向的所有0点都能作为起点,它联通的所有1点都能做终点。于是有了一个有意思的问题,边有值0或者1,点没有值,怎么搞?自己纠结一会。
对一个既有0边又有1边的点,它是什么性质?反正不看答案我很难想到怎么解。
答案是0边1边分开考虑,只考虑0边,然后构建了一些连通子图,1边也是。然后0和1之间是有交集的,交集就是那些既有0边又有1边的点,但是他们已经两个世界了。
那么对于一个点来说,它所在的0边连通子图和1边连通子图之间相乘就是最终答案了!
我服!