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边连通子图之间相乘就是最终答案了!

我服!

 

posted @ 2019-05-02 13:59  Cloud.9  阅读(237)  评论(0编辑  收藏  举报