洛谷P1395 會議 題解

2022-03-17 20:02:47 字數 1281 閱讀 7491

$題目$

為什麼這個題會有圖論的標籤啊,雖然圖論也包括找樹的重心,可是這很容易讓人聯想到最短路,但不得不說,這是乙個典型的找樹的重心模板題。

樹的重心是什麼?

找到乙個點,其所有的子樹中最大的子樹節點數最少,則這個點便是樹的重心。

而我們找樹的重心該怎麼找呢,我們可以從定義入手,我們可以搜尋。

我們先設任意乙個點為樹的根(比如 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個方向的搜尋,...