$題目$
為什麼這個題會有圖論的標籤啊,雖然圖論也包括找樹的重心,可是這很容易讓人聯想到最短路,但不得不說,這是乙個典型的找樹的重心模板題。
樹的重心是什麼?
找到乙個點,其所有的子樹中最大的子樹節點數最少,則這個點便是樹的重心。
而我們找樹的重心該怎麼找呢,我們可以從定義入手,我們可以搜尋。
我們先設任意乙個點為樹的根(比如 1號節點),這樣就把這棵樹變成了有根樹。
然後我們可以求出每個節點的總子樹大小和最大子樹大小,然後可以得到遞推式。
我們可以初始化每個節點的size都為1.
size[i] = size[i] + size[j] (j是i的子樹)
然後就可以愉快地上**了
#include #include#include
#include
using
namespace
std;
struct
cym e[
1000100
];int cnt, lin[1000100], dp[1000100], size[1000100], n, vis[1000010
];inline
void add(int f, int
t)inline
void dfs (int now, int
fa) }
dp[now] = max(dp[now], n - size[now] - 1
); vis[now] = 0;}
//inline int dfs2(int now, int fa)
//int
main()
dfs(
1, 0
); dp[
0] = 21474836;int k = 0
;
for(int i = 1; i <= n; i++)
if(dp[k] >dp[i])
k =i;
printf(
"%d
", k);
memset(size,
0, sizeof
(size));
dfs(k, 0);
int ans = 0
;
for(int i = 1; i <= n; i++)
ans +=size[i];
printf("%d
", ans);
return0;
}
洛谷 P1395 會議(樹的重心)
為什麼要找樹的重心呢?假設我們已經找到了樹的重心,如果把開會地點從重心向右移走,那麼對答案的貢獻就是 左邊的元素和 右邊的元素和。而因為是樹的重心,所以向右移走後左面的元素數量一定大於右面的元素數量,所以ans是比在重心的情況大的,所以最終我們選擇重心。include include include...
P1395 會議(樹上找一點到所有點距離和最小)
題意 一顆n個點的樹,n 1條邊,每條邊的權值為1,找到乙個點,使得所有點到這個點的距離之和最小。思路 我們假設點1為根時,總花費為f 1 假設點2是點1的子節點,那麼f 2 f 1 點2的子節點個數 n 點2的子節點個數 因為我們把根從1換到2的時候,2的子樹中節點貢獻全部 1,其他節點貢獻全部 ...
洛谷 P1101 題解
這道題可以用深搜 回溯 來寫,相信大部分人都是這麼想的,但是有些人可能在一些地方饒了半天,所以這裡就貼一下我的思路,個人覺得自己的很好懂,除了tx和ty那裡,但是tx和ty的那種用法對於輸出路徑的題目一般很實用 這個算是比較簡單的吧,題目裡給出了具體要找的字串,我們要做的就是對它進行8個方向的搜尋,...