acwing 846 樹的重心 (樹的深度遍歷)

2021-10-21 03:17:49 字數 1061 閱讀 3756

如圖,樹的重心就是乙個節點,如果將這個節點刪除,剩餘連通塊中點數最大的最小值,樣例中樹的重心是4,要知道,樹的重心是不唯一的,但是值是唯一的

我們可以用樹的深搜,dfs記錄以u為根節點子樹的大小(包括自己),然後就可以求出刪除這個點以後所有的連通塊(以這個點為根節點的所有子樹,整棵樹刪除以這個點為根節點的樹),在這些中去乙個最大,然後在最後更新一下最大的最小就是答案

#include

#include

#include

#include

#include

using

namespace std;

const

int n =

1e5+10;

int n;

int h[n]

, e[n *2]

, ne[n *2]

, idx;

bool st[n]

;int cnt = n;

//最大值的最小值

//新增一條a-->b的邊

void

add(

int a,

int b)

//返回以u為根節點子樹的大小(包括自己)

intdfs

(int u)

} res =

max(res, n - s)

; cnt =

min(res, cnt)

;return s;

}int

main()

dfs(1)

; cout << cnt << endl;

return0;

}

AcWing 846 樹的重心

大佬的題解 題目鏈結 這道題給的標籤竟然是 樹與圖的深度優先遍歷 這是神馬玩意,然後我點進去看了一下,果然還是沒有思路,然後看了y總,如願以償,y總yyds,我看懂了,然後我就認真再看了一遍題。我覺得好像是求子樹問題,然後我就有了思路。大佬的題解其實講的很清楚,最主要的是靠自己的想象,最關鍵的幾個變...

ACWing846 樹的重心

dfs,一次遍歷,求出每個結點去除該點後的最大連通塊的個數,同時更新ans 全域性變數存放最終結果 1 include2 include3 include4 using namespace std 56 const int n 100010 7 int h n e n 2 ne n 2 idx 樹為...

AcWing 846 樹的重心

給定一顆樹,樹中包含n個結點 編號1 n 和n 1條無向邊。請你找到樹的重心,並輸出將重心刪除後,剩餘各個連通塊中點數的最大值。重心定義 重心是指樹中的乙個結點,如果將這個點刪除後,剩餘各個連通塊中點數的最大值最小,那麼這個節點被稱為樹的重心。輸入格式 第一行包含整數n,表示樹的結點數。接下來n 1...