点此看题
关键在于讨论 l c a lca lca在哪儿,计算出了环的长度总和就有了环的平均长度:
#include <cstdio>
#include <iostream>
using namespace std;
#define int long long
const int M = 100005;
int read()
{int x=0,flag=1;char c;while((c=getchar())<'0' || c>'9') if(c=='-') flag=-1;while(c>='0' && c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();return x*flag;
}
int n,m,tot,f[M],fa[M][20],siz[M],dd[M],du[M],dep[M];
struct edge
{int v,next;
}e[2*M];
void dfs(int u,int p)
{dep[u]=dep[p]+1;fa[u][0]=p;siz[u]=1;for(int i=1;i<20;i++)fa[u][i]=fa[fa[u][i-1]][i-1];for(int i=f[u];i;i=e[i].next){int v=e[i].v;if(v==p) continue;dfs(v,u);siz[u]+=siz[v];dd[u]+=dd[v]+siz[v];}
}
void dfs2(int u)
{for(int i=f[u];i;i=e[i].next){int v=e[i].v;if(v==fa[u][0]) continue;du[v]=du[u]+dd[u]-(dd[v]+siz[v])+(n-siz[v]);dfs2(v);}
}
int lca(int u,int v,int t)
{if(dep[u]<dep[v]) swap(u,v);if(t==1){for(int i=19;i>=0;i--)if(dep[fa[u][i]]>dep[v])u=fa[u][i];return u;}for(int i=19;i>=0;i--)if(dep[fa[u][i]]>=dep[v])u=fa[u][i];if(u==v) return u;for(int i=19;i>=0;i--)if(fa[u][i]^fa[v][i])u=fa[u][i],v=fa[v][i];return fa[u][0];
}
signed main()
{n=read();m=read();for(int i=1;i<n;i++){int u=read(),v=read();e[++tot]=edge{v,f[u]},f[u]=tot;e[++tot]=edge{u,f[v]},f[v]=tot;}dfs(1,0);dfs2(1);for(int i=1;i<=m;i++){int x=read(),y=read(),t=lca(x,y,0);int t2=lca(x,y,1),ans=0,d=dep[x]+dep[y]-2*dep[t]+1;if(x==t){ans+=(du[x]+dd[x]-dd[t2]-siz[t2])*siz[y];ans+=dd[y]*(n-siz[t2]);printf("%lfn",1.0*ans/(n-siz[t2])/siz[y]+d);}else if(y==t){ans+=(du[y]+dd[y]-dd[t2]-siz[t2])*siz[x];ans+=dd[x]*(n-siz[t2]);printf("%lfn",1.0*ans/(n-siz[t2])/siz[x]+d);}else{ans+=dd[x]*siz[y];ans+=dd[y]*siz[x];printf("%lfn",1.0*ans/siz[x]/siz[y]+d);}}
}
本文发布于:2024-02-04 05:07:06,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170699749852328.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |