樹的重心 DFS

2022-06-03 05:27:10 字數 742 閱讀 9263

#include

#include

#include

#include

#include

using namespace std;

const int maxn=1e5+10;

vectorv[maxn];

int subtree[maxn];//表示每點除去自身所對應的子樹大小

bool vis[maxn];//用以標記,去重

int n;

void dfs(int father,int node)//father記錄node上一步路徑**

dfs(node,son);

if(vis[son] == true)   continue ;//走過son路徑

subtree[node]+=subtree[son];//統計除去node本身的子樹大小

vis[node]=true;//標記

}subtree[node]=max(subtree[node],n-subtree[node]);//去除node節點,儲存兩棵子樹中的最大值

}int main()

dfs(0,1);//任意一點開始dfs,1號節點沒有父親,因而father為0

int res=maxn;int node=0;

for(int i = 1 ; i <= n; i++)

}cout << node << " "

<< res << endl;

return0;}

演算法程式設計 樹的重心 DFS

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

求樹的重心

題目 題意 給定一棵樹,求樹的重心的編號以及重心刪除後得到的最大子樹的節點個數size,如果size相同就選取編號最小的.分析 首先要知道什麼是樹的重心,樹的重心定義為 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵 樹的重心,刪去重 心後,生成的多棵樹盡可能平衡.實際上樹的重心...

專題 樹的重心

定義1 找到乙個點,刪除它得到的森林中最大的子樹節點數最少,那麼這個點就是這棵樹的重心。定義2 刪除重心後得到的所有子樹,其頂點樹必然不超過n 2 性質1 樹中所有點到某個點的距離和中,到重心的距離和是最小的 如果有兩個重心,那麼他們的距離和一樣。性質2 把兩個樹通過一條邊相連得到乙個新的樹,那麼新...