Test instructions: To seek the center of gravity of a tree; center of gravity definition: The maximum number of subtree nodes with this node as root is minimal.
Solution: DFS
Code:
/******************************************************* @author: xiefubao************************************** /#pragma COMMENT (linker, "/stack:102400000,102400000") #include <iostream> #include < cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <vector> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include < String.h>//freopen ("In.txt", "R", stdin), using namespace std, #define EPS 1e-8#define Zero (_) (ABS (_) <=eps) Const D Ouble Pi=acos ( -1.0); typedef long Long ll;const int max=20010;const LL inf=0x3fffffff;vector<int> vec[max];int N; int Num[max];int ansnum;int ans;void dfs (int t,int be) {int ma=0; int sum=0; for (int i=0;i<vec[t].size (); i++) {if (vec[t][i]==be) continue; DFS (VEC[T][I],T); Ma=max (Ma,num[vec[t][i]); Sum+=num[vec[t][i]]; } ma=max (ma,n-sum-1); num[t]=sum+1; if (ansnum>ma| | (Ansnum==ma&&t<ans)) {Ansnum=ma; ans=t; }}int Main () {int t; cin>>t; while (t--) {scanf ("%d", &n); ansnum=n+2; memset (num,0,sizeof num); for (int i=1; i<=n; i++) vec[i].clear (); for (int i=0; i<n-1; i++) {int A, B; scanf ("%d%d", &a,&b); Vec[a].push_back (b); Vec[b].push_back (a); } dfs (1,0); cout<<ans<< "" <<ansnum<<endl; } return 0;}
poj1655 (center of gravity of the tree)