题目大意:一棵树上有n个结点n-1条边,在一个结点上建立消防局,可以保证连边不超过2的结点无消防隐患,至少要建立多少个消防局?
题目描述
2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地。起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构。如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d。
由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局。消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾。
你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时,消防队有能力及时扑灭火灾。
输入输出格式
输入格式:
输入文件名为input.txt。
输入文件的第一行为n (n<=1000),表示火星上基地的数目。接下来的n-1行每行有一个正整数,其中文件第i行的正整数为a[i],表示从编号为i的基地到编号为a[i]的基地之间有一条道路,为了更加简洁的描述树状结构的基地群,有a[i]<i。
输出格式:
输出文件名为output.txt
输出文件仅有一个正整数,表示至少要设立多少个消防局才有能力及时扑灭任何基地发生的火灾。
输入输出样例
输入样例#1:
6 1 2 3 4 5
输出样例#1:
2
解题思路
不妨设1为树的根结点。如果从上往下(深度小的优先),那么第一个消防局设立在哪呢?肯定不是根结点,因为设立在根结点的儿子会更好,扩散区域更大,那选哪一个儿子结点呢?这就是一个问题了。其实,我们可以试试从下往上(深度大的优先),只要有隐患的结点,都需要多设立一个消防局,那这个消防局必定设在该结点的爷爷结点最优——低一点,范围少,远一点,顾不到。设立消防局后,这个以该结点为根的子树都无隐患了,标记一下。这样,只要遇到隐患结点,就在爷爷结点建立消防局,直到整个树都无隐患。