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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章