#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 把兩個樹通過一條邊相連得到乙個新的樹,那麼新...