給定一棵n個節點的樹,去掉這棵樹的一條邊需要消耗值1,為這個圖的兩個點加上一條邊也需要消耗值1。樹的節點編號從1開始。在這個問題中,你需要使用最小的消耗值(加邊和刪邊操作)將這棵樹轉化為環,不允許有重邊。
環的定義如下:
(1)該圖有n個點,n條邊。
(2)每個頂點的度數為2。
(3)任意兩點是可達的。
樹的定義如下:
(1)該圖有n個點,n-1條邊。
(2)任意兩點是可達的。
第一行是乙個整數n代表節點的個數。
接下來n-1行每行有兩個整數u, v(1 ≤ u, v ≤ n),表示雙向邊(u, v)
輸出把樹轉化為環的最小消耗值。
1 22 3
2 4對於20%的資料,有1≤n≤10。
對於100%的資料,有1≤n≤1000000。
對於一棵樹,我們可以把它分成很多條鏈,然後再用邊連起來。
至於怎麼連,當然是如果原來有這些邊就連這些啦
如果乙個非葉子節點只有乙個兒子,那麼肯定不能剪斷,如果有j(j>1)個,那麼就要剪j-1個。但是如果它是根節點,那麼就要少剪乙個(畫個圖就可以懂了)。那麼答案就是剪枝個數*2+1.
但還有乙個問題,這樣做答案會偏大。為什麼呢?
如果我們剪了一條邊,那麼這條邊下面的兒子就會變成子樹的根節點,所以我們多剪了。
換句話說,只要那棵子樹k>1,這棵子樹就可以忽略不計
#include
using
namespace std;
const
int maxn=
2e6+77;
int n,last[maxn]
,q[maxn]
,fa[maxn]
,f[maxn]
,ans,cnt;
struct e
e[maxn*2]
;void
add(
int u,
int v)
void
bfs()}
for(
int i=r; i>
0; i--)}
void
solve()
for(
int i=last[u]
; i; i=e[i]
.next)}}
intmain()
JZOJ A組 量子糾纏
第一行包含乙個正整數 m,代表運算元。接下來 m 行,每行可能有以下形式 1 s 代表將數字串 s 加入資訊集中 2 s 代表詢問數字串 s 是否在資訊集中 3 a b 代表使數字串 a 和 b 互相糾纏 對於每乙個 2 操作,如果詢問串不在集合中,請輸出一行乙個整數 0,否則輸出一行乙個整 數 1...
JZOJ A組 跳樓機
djl為了避免成為乙隻鹹魚,來找srwudi學習壓 的技巧。srwudi的家是一幢h層的摩天大樓。由於前來學習的蒟蒻越來越多,srwudi改造了乙個跳樓機,使得訪客可以更方便的上樓。經過改造,srwudi的跳樓機可以採用以下四種方式移動 1 向上移動x層 2 向上移動y層 3 向上移動z層 4 回到...
JZOJ A組 傳送門
8102年,normalgod在glados的幫助下,研製出了傳送槍。但glados想把傳送槍據為己有,於是把normalgod扔進了一間實驗室。這間實驗室是一棵有n個節點的樹。現在normalgod在一號節點,出口也在一號節點,但為了開啟它,必須經過每乙個節點按下每個節點的開關,出口才能開啟。gl...