poj3107(樹的重心)

2021-06-26 02:33:07 字數 844 閱讀 6308

求樹的重心。樹的重心是指去掉重心之後剩下的子樹的最大結點個數最少

樹形dp,dp[i]表示以i為重心,剩下的子樹的最大結點個數,狀態轉移dp[i] = max(dp[i], siz[j])。

注意用vector超時。

**如下:

#include#include#include#include#include#include#include#define n 50005

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define eps 10e-6

using namespace std;

int n,tot;

int siz[n],dp[n],head[n];

struct node

edge[n*2];

void addedge(int u,int v)

void dfs(int u,int pa)

dp[u] = max(dp[u], n-siz[u]);

}int main()

tot = 0;

dfs(1,0);

int ans = inf;

for(i = 1; i <= n; i++) ans = min(ans,dp[i]);

for(i = 1; i <= n; i++) if(ans == dp[i])

for(i = i+1; i <= n; i++) if(ans == dp[i]) printf(" %d",i);

printf("\n");

}return 0;

}

POJ 3107樹的重心

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

POJ 3107樹的重心

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

樹的重心求法POJ3107

題目的意思很明確,就是求所有樹的重心 再按字典序輸出 樹是很常見的資料結構,樹的重心在樹的分治中非常有用,所以對於大規模的樹快速求出重心省節時間是乙個oi選手需要考慮的問題。那麼我們先介紹一下樹的重心。樹的重心定義為 樹中的乙個點,刪掉該點,使剩下的樹所構成的森林中最大的子樹節點數最少。樹的重心推論...