提交时间:2024-11-06 11:38:02
运行 ID: 34354
#include<bits/stdc++.h> using namespace std; #define int long long const int N=2e5+10,M=1e9+7; int n,h,t,len,dis[N][2],d[N],pre[N][2],q[N],f,b; //ct[i]:距离直径的两端点都<=i的点的个数 //g[i]:权值为<=i的方案数 //mct[i]:到直径两端点距离都>i的点的个数 int p[N],ct[N],g[N],mct[N]; bool vis[N]; struct Edge{int v,nx;}e[N<<1];int CNT,H[N]; void add(int u,int v){e[++CNT]={v,H[u]};H[u]=CNT;} void find(int u,int dep,bool op){ vis[u]=1;bool flag=0;int v; for(int i=H[u];i>0;i=e[i].nx){ v=e[i].v;if(vis[v])continue; find(v,dep+1,op);flag=1; } if(!flag&&dep>len){ len=dep; if(!op)h=u; else t=u; }return; } void bfs(int root,bool op){ for(int i=0;i<=N-5;i++)vis[i]=0; f=b=0;q[++f]=root;b++; dis[root][op]=0;vis[root]=1; while(f<=b){ int u=q[f],v;f++; for(int i=H[u];i>0;i=e[i].nx){ v=e[i].v; if(vis[v])continue; dis[v][op]=dis[u][op]+1; q[++b]=v;vis[v]=1; } } } signed main(){ // freopen("color.in","r",stdin); cin>>n; p[0]=1; for(int i=1;i<=n;i++)p[i]=p[i-1]*2%M; int u,v; for(int i=1;i<=n-1;i++){cin>>u>>v;add(u,v);add(v,u);} //求直径 find(1,0,false); len=0;for(int i=0;i<=N-5;i++)vis[i]=0; find(h,0,true); // cout<<h<<" "<<t<<endl; //求直径两端点到其他所有点的距离 bfs(h,0);bfs(t,1); // for(int i=1;i<=n;i++)cout<<dis[i][0]<<" "<<dis[i][1]<<endl; //处理限制 for(int i=1;i<=n;i++){ if(i==h||i==t)continue; int mmax=max(dis[i][0],dis[i][1]),mmin=min(dis[i][0],dis[i][1]); // cout<<i<<" "<<mmax<<" "<<mmin<<endl; ct[mmax]++;mct[mmin-1]++; } for(int i=1;i<=len;i++){ct[i]+=ct[i-1];} for(int i=len;i>=1;i--){mct[i]+=mct[i+1];} for(int i=1;i<=len;i++){ if(mct[i]>0)continue; g[i]=2*p[ct[i]]%M;//cout<<i<<" "<<g[i]<<endl; } // cout<<endl; int ans=0; for(int i=1;i<=len;i++)ans=(ans+g[i]*i%M)%M; cout<<ans<<endl; return 0; }