樹的重心模板(以POJ 1655為例)
阿新 • • 發佈:2019-02-01
#pragma comment(linker, "/STACK:102400000,102400000") ///#include<unordered_map> ///#include<unordered_set> #include<algorithm> #include<iostream> #include<fstream> #include<complex> #include<cstdlib> #include<cstring> #include<cassert> #include<iomanip> #include<string> #include<cstdio> #include<bitset> #include<vector> #include<cctype> #include<cmath> #include<ctime> #include<stack> #include<queue> #include<deque> #include<list> #include<set> #include<map> using namespace std; #define pt(a) cout<<a<<endl #define debug test #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define rep(i,a,n) for (int i=a;i<=n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pii pair<int,int> #define fi first #define se second #define ll long long #define ull unsigned long long #define pb push_back #define mp make_pair #define inf 0x3f3f3f3f #define eps 1e-10 #define PI acos(-1.0) const ll mod = 1e9+7; const int N = 1e6+10; ll qp(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} int to[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int t,n,son[N],ans[N],vs[N],id,cnt; vector<int> g[N]; void dfs(int x) { son[x]=1;///自身 vs[x]=1; int mxt=0;///最大子樹節點個數 for(int i=0;i<g[x].size();i++) { int v=g[x][i]; if(vs[v]) continue; dfs(v); son[x]+=son[v];///son[x]為每個節點子節點的個數 mxt=max(mxt,son[v]);///比較更大的子樹節點個數 } ans[x]=max(mxt,n-son[x]); } int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); while(cin>>t) { while(t--) { cin>>n; for(int i=1;i<=n;i++) g[i].clear(); mst(vs,0); mst(son,0); mst(ans,0); for(int i=1;i<n;i++) { int a,b; cin>>a>>b; g[a].pb(b),g[b].pb(a); } dfs(1); cnt=inf; for(int i=1;i<=n;i++) { if(ans[i]<cnt) { cnt=ans[i]; id=i; } } cout<<id<<" "<<cnt<<endl; } } return 0; }