题目大意:给你一个树,树每个点都有一个值, 这个点的的值就等于所有儿子里面点最多的那个儿子,值最小的就叫做重心,求出重心,还有所有等于重心的点,按照升序输出。
分析:就是一个简单的搜索树,求出来最大的儿子点数就行......
=============================================================================================================================
#include<stdio.h> #include<algorithm> #include<string.h> #include<vector> using namespace std; const int MAXN = 16007; int val[MAXN], MinVal, cnt, N; bool used[MAXN]; vector<int> G[MAXN]; int DFS(int k) { int sumSon = 0; for(int i=0; i<G[k].size(); i++) { int v = G[k][i]; if(!used[v]) { used[v] = true; int son = DFS(v); val[k] = max(val[k], son); sumSon += son; } } val[k] = max(val[k], N-sumSon-1); if(MinVal > val[k]) { MinVal = val[k]; cnt = 1; } else if(MinVal == val[k]) cnt++; return sumSon + 1; } int main() { int u, v; scanf("%d", &N); for(int i=1; i<N; i++) { scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } MinVal = MAXN; used[1] = true; DFS(1); printf("%d %d ", MinVal, cnt); int flag=0; for(int i=1; i<=N; i++) { if(val[i] == MinVal) { if(flag++)printf(" "); printf("%d", i); } } printf(" "); return 0; }