TREE_worth thinking ~!

Tree
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 1117   Accepted: 348

Description

Consider a tree with N vertices, numbered from 1 to N. Add, if it is possible, a minimum number of edges thus every vertex belongs to exactly one cycle.

Input

The input has the following structure:
N
x(1) y(1)
x(2) y(2)
...
x(N-1) y(n-1)
N (3 <= N <=100) is the number of vertices. x(i) and y(i) (x(i), y(i) are integers, 1 <= x(i), y(i) <= N) represent the two vertices connected by the i-th edge.

Output

The output will contain the value -1 if the problem doesn't have a solution, otherwise an integer, representing the number of added edges.

Sample Input

7
1 2
1 3
3 5
3 4
5 6
5 7

Sample Output

2

Source

老大的方法,明白了之后有中心旷神怡的感觉。
对于一棵树,某节点的各个信息会和父亲以及儿子是有关的。
在此题中,要求出树上所有的点必须在且仅在一个环上需要加入的最少的边,首先考虑若要使所有的点都在环上需要的最少边是如何求解的,就是说求以根节点为根的树上的点全部在环上的状态,看此种状态是否可以有效求解,在此种状态下,根节点在环上,并且环上的点全部是以该点为根的子树的点,继续考虑,怎样才能得到这样的一个环,那么有两种情况:1.根节点和其中子节点的一枝相连;2.两个不同子节点的两枝相连;所以说只是记录以某节点为根的子树上的节点全部在唯一的环上去要的最小加入的边个数是不够的,分析需要的信息,要知道任意节点留出一枝时候的最优值。所以如上所述,本应该记录两个值:以某点为根的子树上的全部节点都在唯一的环上需要的最少边数,以及以某一点为根的子树上留出一枝包含该节点的枝的最优值。这样就能通过枚举子树的值求得根节点的最优值。
但是在此题中,有一个限制,就是说,如果两边之前有边存在则不能在两点上加边。
问题复杂了一点,但是仍然有很明了的关系,就是说,如果有这样的限制,显然只有一种情况是不符合的,就是根节点和一枝连上了,但是连的恰好是自己的儿子,所以,在以某节点为根子树留出一枝,剩下全部在环上的最优值分为两部分,一个就是这个枝只有一个节点,就是该节点本身,另外就是有一枝且该节点不是留出枝节的最后一个节点。
现在 把问题整理一下,总共有三种状态;
1.以某点为根节点时子树上所有节点都在满足条件需要加的最少的边数;
2.以某节点为根时留出一枝且此枝含有多个节点时候其他点全部满足条件时候的最优值;
3.以某节点为根时留出一枝且此枝含有一个节点时候其他点全部满足条件时候的最优值;
那么1状态是子节点2 和3状态枚举而来;
2是子节点2状态和3状态枚举而来;
3是子节点1状态叠加而来;
很神奇吧……无限膜拜老大……
发布了50 篇原创文章 · 获赞 1 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章