ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题解:树

2021-05-31 16:05:33  阅读:158  来源: 互联网

标签:状态 点亮 题解 son 指示灯 节点 输入


Description:

题目描述

  图论中的树为一个无环的无向图。给定一棵树,每个节点有一盏指示灯和一个按钮。如果节点的按扭被按了,那么该节点的灯会从熄灭变为点亮(当按之前是熄灭的),或者从点亮到熄灭(当按之前是点亮的)。并且该节点的直接邻居也发生同样的变化。
  开始的时候,所有的指示灯都是熄灭的。请编程计算最少要按多少次按钮,才能让所有节点的指示灯变为点亮状态。

输入格式

  输入文件有多组数据。
  输入第一行包含一个整数n,表示树的节点数目。每个节点的编号从1到n。输入接下来的n – 1行,每一行包含两个整数x,y,表示节点x和y之间有一条无向边。
当输入n为0时,表示输入结束。

输出格式

  对于每组数据,输出最少要按多少次按钮,才能让所有节点的指示灯变为点亮状态。每一组数据独占一行。

样例:

样例输入:

3
1 2
1 3
0

样例输出:

1

数据范围与提示

  对于100%的数据,满足1<=n<=100。

基本思路:

  题目中很明确,是一棵树嘛,所以考虑树状DP。定义状态数组:

c[i][j],i表示第i个点,j表示状态,取值为1~3;

  其中,状态1表示自己按,然后自己亮了;状态2表示自己不按然后亮了(被儿子弄亮了);状态3表示自己不按,自己也没亮。
那么有状态转移方程:

c[i][1]=sigma(c[son][3]);
c[i][2]=sigma(min(c[son][1],c[son][2]));
c[i][3]=sigma(min(c[son][1],c[son][2]));

  要注意:对于2、3状态,要统计儿子状态1的个数,如果是奇数则直接加到2状态里去,偶数就是3。此外,还要统计儿子里abs(c[son][1]-c[son][2])的最小值,然后与所的总和一起加到刚才没被赋值的状态里;
  还有一个问题,就是对于叶子节点,他的2、3状态没有意义,所以,c[leaf][2]=INT_MAX,c[leaf][3]=0,这样在统计时就不会统计他的2状态;
  然后往上DP就好了。
  这次没有代码。。。
2021.5.31 现役

标签:状态,点亮,题解,son,指示灯,节点,输入
来源: https://www.cnblogs.com/Geek-Kay/p/14831774.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有