JZOJ A組 樹環轉換

2021-09-24 20:32:55 字數 1183 閱讀 1515

給定一棵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...