1. 程式人生 > >【模板·樹的重心】 codevs 3639 樹的中心

【模板·樹的重心】 codevs 3639 樹的中心

題目:樹的中心

樹的重心

找到一個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹儘可能平衡。

所以dfs下就好了。

程式碼:

#include<bits/stdc++.h>
using namespace std;

#define maxn 16000
#define inf (1e9)
#define read(x) scanf("%d",&x)

int n;
vector<int> tr[maxn+5];

int d[maxn+5];
int minmaxd;
vector<
int> ans; void readin() { read(n); for(int i=1;i<n;i++) { int x,y; read(x),read(y); tr[x].push_back(y); tr[y].push_back(x); } } void dfs(int x,int fa) { d[x]=1; int maxd=0; for(int i=0;i<tr[x].size();i++) { if(tr[x][i]==fa) continue; dfs(tr[x][i],x); maxd=max(maxd,d[tr[x]
[i]]); d[x]+=d[tr[x][i]]; } maxd=max(maxd,n-d[x]); if(maxd==minmaxd) ans.push_back(x); else if(maxd<minmaxd) { ans.clear(); ans.push_back(x); minmaxd=maxd; } } int main() { readin(); minmaxd=inf; dfs(1,0); sort(ans.begin(),ans.end()); printf("%d %d\n",minmaxd,ans.size()); for(int
i=0;i<ans.size();i++) printf("%d ",ans[i]); return 0; }