#include using namespace std; typedef int64_t i64; typedef uint64_t ui64; class graph{ public: struct adj{ int index; int start; int to; i64 cost; }; int nd; int eg; vector *node; vector edge; graph(int n,int m){ nd=n; eg=m; node=new vector[nd]{}; edge={}; } void add_dir(int i,int s,int t,i64 c){ node[s].push_back({i,s,t,c}); edge.push_back({i,s,t,c}); } void add_undir(int i,int s,int t,i64 c){ node[s].push_back({i,s,t,c}); node[t].push_back({i,t,s,c}); edge.push_back({i,s,t,c}); } void refr(void){ for(int i=0;i().swap(node[i]); delete[] node; vector().swap(edge); } bool IsLink(void); void DFS(int r,int *&p); void DFS_sub(int r,int *&p,bool *&vst); bool IsPlus(void); void BellmanFord(int s,i64 *&d); void Dijkstra(int s,i64 *&d); void BFS(int s,i64 *&d); void WarshallFloyd_dir(i64 **&d); void WarshallFloyd_undir(i64 **&d); i64 WMST_dir(int r); i64 WMST_undir(void); void Edmonds(int r,vector &p); void Kruscal(vector &p); void Prim(vector &p); void Artic(vector &p); void Artic_sub(int r,int &k,int par,vector &p,int *&ord,int *&low,bool *&vst); void Bridge(vector &p); void Bridge_sub(int r,int &k,int par,vector &p,int *&ord,int *&low,bool *&vst); void SCC(int *&c); void SCC_sub1(int r,vector &vs,bool *&vst); void SCC_sub2(int r,int k,int *&c,bool *&vst,graph &rg); bool IsDAG(void); bool IsDAG_sub(int r,int &k,int *&l,int *&vst); void TopolSort(int *&l); void TopolSort_sub(int r,int &k,int *&l,bool *&vst); i64 Diameter(void); void Height(i64 *&h); void DFSTree(int s,vector &es); void DFSTree_sub(int r,vector &es,bool *&vst); void Cumul(int s,i64 *&d); void func(int r,int *&p,i64 *&es); void func_sub(int r,int *&p,i64 *&es,bool *&vst); }; void graph::DFS(int r,int *&p){ bool *vst=new bool[nd]{}; DFS_sub(r,p,vst); delete[] vst; } void graph::DFS_sub(int r,int *&p,bool *&vst){ vst[r]=1; int c=0; for(const auto &i:node[r]){ if(!vst[i.to]) DFS_sub(i.to,p,vst); c+=p[i.to]; } p[r]=c+1; } void graph::func(int r,int *&p,i64 *&es){ bool *vst=new bool[nd]{}; func_sub(r,p,es,vst); delete[] vst; } void graph::func_sub(int r,int *&p,i64 *&es,bool *&vst){ vst[r]=1; for(const auto &i:node[r]){ if(vst[i.to]) continue; es[i.index]=(i64)p[i.to]*((i64)nd-p[i.to])*2; func_sub(i.to,p,es,vst); } } int main(void){ int n; scanf("%i",&n); graph g(n,n-1); int s,t; i64 w; for(int i=0;i