POJ 3107 Godfather(樹的重心)

2022-05-09 14:30:47 字數 1548 閱讀 2075

嘟嘟嘟

題說的很明白,就是求樹的重心。

我們首先dfs一遍維護每乙個點的子樹大小,然後再dfs一遍,對於乙個點u,選擇子樹中size[v]最小的那個和n - size[u]比較,取最大作為刪除u後的答案max[u]。

然後再o(n)遍歷一遍取min(max[i]).

寫**的時候兩次dfs可以合併。

然後這題竟然卡vector,不得不用鏈前存圖……簡直有毒。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter puts("")

13#define space putchar(' ')

14#define mem(a, x) memset(a, x, sizeof(a))

15#define rg register

16 typedef long

long

ll;17 typedef double

db;18

const

int inf = 0x3f3f3f3f;19

const db eps = 1e-8;20

const

int maxn = 5e4 + 5;21

inline ll read()

2226

while(isdigit(ch))

27if(last == '

-') ans = -ans;

28return

ans;29}

30 inline void

write(ll x)31

3637

intn;

38struct

node

39e[maxn << 1

];42

int head[maxn], ecnt = 0;43

void add(int x, int

y)44

4950

bool

vis[maxn];

51int

siz[maxn], max[maxn];

52void dfs(int now, int

fa)53

62 max[now] = max(max[now], n -siz[now]);63}

6465

intmain()

66

74 dfs(1, 0

);75

int min =inf;

76for(int i = 1; i <= n; ++i) min =min(min, max[i]);

77for(int i = 1; i <= n; ++i) if(max[i] ==min) write(i), space;

78enter;

79return0;

80 }

view code

poj3107(樹的重心)

求樹的重心。樹的重心是指去掉重心之後剩下的子樹的最大結點個數最少 樹形dp,dp i 表示以i為重心,剩下的子樹的最大結點個數,狀態轉移dp i max dp i siz j 注意用vector超時。如下 include include include include include include...

POJ 3107樹的重心

題意 找樹的重心。定義就是以重心為根的所有子樹裡面最大的最小。做法 瞎dfs一下就行了。記錄一下子樹。重點 這個題vector暴力存邊並不行。水了這麼多水題第一次被卡了。該來的總還是會來。所以用鏈式向前星來模擬鄰接表。比vector速度快的很多,也不難寫。include include includ...

POJ 3107樹的重心

題意 找樹的重心。定義就是以重心為根的所有子樹裡面最大的最小。做法 瞎dfs一下就行了。記錄一下子樹。重點 這個題vector暴力存邊並不行。水了這麼多水題第一次被卡了。該來的總還是會來。所以用鏈式向前星來模擬鄰接表。比vector速度快的很多,也不難寫。include include includ...