https://www.luogu.org/problemnew/show/P2279
和刘汝佳白书第一章一道例题差不多。
确实是无根树,但是我们可以把它"看做"有根树,这样并不会影响这棵树的性质,这棵树该是什么样还是什么样的,这只是一个看待的方式,这样我们更容易去思考。
考虑当前深度最大的结点,肯定要有一个消防局去覆盖它,这个消防局可以是三个位置:他的父亲,他的兄弟,他的爷爷。
显然,他的父亲和兄弟可以覆盖到的点全部可以被他的爷爷覆盖到,并且他的爷爷可能覆盖到更多的结点,因此选他的爷爷做消防局。
那么,做法就有了:先预处理出各个深度的点集,然后从深到浅,遇到未覆盖结点时取它的爷爷做消防局,并以它的爷爷为起点dfs2层,标记掉覆盖的结点。
这样的复杂度比n^2要小,但比n要大得多,我是不会算。
洛谷排名第一的题解给了一种更好的实现https://www.luogu.org/blog/contributation/solution-p2279 ,非常简短。