一棵树,n个节点,边长为1,有q个询问,每个询问给出u,v(u != v),问在树上等概率加一条边,如果使得u,v在一个环内,则这种加边方式是合法的,此时的值为环的长度,所有合法的加边方式出现的概率相等,问值的期望。

2 <= n,m <= 10^5

对于u,v原来路径上的边一定在环内,贡献为1,新加的边也一定在环内,贡献为1,求其余的边的贡献就行了

分2种情况考虑:

1.lca(u,v) 不等于u 和 v

2.lca(u,v) 为u 或者 v

代码:

//File Name: cf629E.cpp
//Created Time: 2017年01月05日 星期四 17时20分29秒 #include <bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = + ;
int siz[MAXN],dis[MAXN];
int pa[MAXN][];
LL f[MAXN],g[MAXN];
vector<int> G[MAXN];
void dfs0(int u,int p){
siz[u] = ;
dis[u] = dis[p] + ;
f[u] = ;
for(int i=;i<G[u].size();++i){
int v = G[u][i];
if(v == p) continue;
pa[v][] = u;
dfs0(v,u);
siz[u] += siz[v];
f[u] += f[v] + siz[v];
}
}
void dfs1(int u,int p,int n){
for(int i=;i<G[u].size();++i){
int v = G[u][i];
if(v == p) continue;
g[v] = n + g[u] - * siz[v];
dfs1(v,u,n);
}
}
void cal_pa(int n){
for(int j=;(<<j)<=n;++j){
for(int i=;i<=n;++i){
if(pa[i][j-] != -)
pa[i][j] = pa[pa[i][j-]][j-];
}
}
}
int cal_lca(int a,int b){
if(dis[a] < dis[b]) swap(a,b);
int cnt = ;
for(;(<<cnt)<=dis[a];++cnt);
--cnt;
for(int j=cnt;j>=;--j){
if(dis[a] - (<<j) >= dis[b])
a = pa[a][j];
}
if(a == b) return a;
for(int j=cnt;j>=;--j){
if(pa[a][j] != - && pa[a][j] != pa[b][j])
a = pa[a][j],b = pa[b][j];
}
return pa[a][];
}
int cal(int u,int v){
int cnt = ;
for(;(<<cnt)<=dis[u];++cnt);
--cnt;
for(int j=cnt;j>=;--j){
if(dis[u] - (<<j) > dis[v])
u = pa[u][j];
}
return u;
}
void solve(int n,int m){
memset(pa,-,sizeof(pa));
dfs0(,); //dis,siz,in,f,pa[i][0],dep
g[] = f[];
dfs1(,,n); //g
cal_pa(n); // pa
int u,v,lca,w;
while(m--){
scanf("%d %d",&u,&v);
lca = cal_lca(u,v);
if(lca != u && lca != v){
int tmp = dis[u] + dis[v] - * dis[lca] + ;
double ans = tmp + (f[u] + 0.0) / siz[u] + (f[v] + 0.0) / siz[v];
printf("%.15f\n",ans);
}
else{
if(lca == u) swap(u,v);
w = cal(u,v);
if(pa[w][] != v){
printf("-1");
return ;
}
int tmp = dis[u] - dis[v] + ;
double ans = tmp + (f[u] + 0.0) / siz[u] + (g[v] - f[w] - siz[w] + 0.0) / (n - siz[w]);
printf("%.15f\n",ans);
}
}
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=,u,v;i<n;++i){
scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
solve(n,m);
return ;
}

codeforces E. Famil Door and Roads 期望的更多相关文章

  1. Codeforces Round #343 (Div. 2) E. Famil Door and Roads lca 树形dp

    E. Famil Door and Roads 题目连接: http://www.codeforces.com/contest/629/problem/E Description Famil Door ...

  2. codeforces 629C Famil Door and Brackets (dp + 枚举)

    题目链接: codeforces 629C Famil Door and Brackets 题目描述: 给出完整的括号序列长度n,现在给出一个序列s长度为m.枚举串p,q,使得p+s+q是合法的括号串 ...

  3. Codeforces GYM 100876 J - Buying roads 题解

    Codeforces GYM 100876 J - Buying roads 题解 才不是因为有了图床来测试一下呢,哼( 题意 给你\(N\)个点,\(M\)条带权边的无向图,选出\(K\)条边,使得 ...

  4. Codeforces Round #343 (Div. 2) E. Famil Door and Roads (树形dp,lca)

    Famil Door's City map looks like a tree (undirected connected acyclic graph) so other people call it ...

  5. Codeforces 629 E. Famil Door and Roads

    题目链接:http://codeforces.com/problemset/problem/629/E 询问这个简单环的期望.考虑将这个环拆成两部分. 令${deep[x]>=deep[y]}$ ...

  6. Codeforces Round #343 (Div. 2) E. Famil Door and Roads

    题目链接: http://www.codeforces.com/contest/629/problem/E 题解: 树形dp. siz[x]为x这颗子树的节点个数(包括x自己) dep[x]表示x这个 ...

  7. Codeforces 839C Journey - 树形动态规划 - 数学期望

    There are n cities and n - 1 roads in the Seven Kingdoms, each road connects two cities and we can r ...

  8. Codeforces Gym 100338C C - Important Roads tarjan

    C - Important RoadsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contes ...

  9. Codeforces 123E Maze(树形DP+期望)

    [题目链接] http://codeforces.com/problemset/problem/123/E [题目大意] 给出一棵,给出从每个点出发的概率和以每个点为终点的概率,求出每次按照dfs序从 ...

随机推荐

  1. jquery jqPlot API 中文使用教程

    jqPlot是一个灰常强大的图表工具,曲线,柱状,饼图,应该有尽有,更要命的是,调用方便~~ 官网:http://www.jqplot.com/ 这里贡献上中文教程,基本上所有的api都很齐全,供有需 ...

  2. CSS 中 Font-Family 中英文对照表

    在 CSS 中,我们经常会使用 Font-Family 属性来定义字体.其中,中文字体如果直接使用中文名称,很有可能在非中文的系统环境下造成字体异常.所以通常使用字体的英文名称定义 Font-Fami ...

  3. 字符编码详解及由来(UNICODE,UTF-8,GBK)[转帖]

    相信許多人對字符編碼都不是很了解,透過下文可以清晰的理解各种字符编码方式详解及由来. 一直对字符的各种编码方式懵懵懂懂,什么ANSI.UNICODE.UTF-8.GB2312.GBK.DBCS.UCS ...

  4. CentOS7下安装MySQL5.7安装与配置(转)

    原文地址:http://www.centoscn.com/mysql/2016/0626/7537.html 安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1.配置YUM源 在M ...

  5. keras 入门之 regression

    本实验分三步: 1. 建立数据集 2. 建立网络并训练 3. 可视化 import numpy as np from keras.models import Sequential from keras ...

  6. Oracle笔记3-高级查询

    高级查询 1.关联查询 作用:可以跨多表查询 --查询出员工的名字和他所在部门的名字 //错误//select first_name,name from s_emp,s_dept; //错误原因:产生 ...

  7. EXTJS4.2中neptune主题的使用

    原文地址:http://blog.csdn.net/xieguojun2013/article/details/8880519 最近在在sencha.com官网了解到EXTJS的最新版本里增加了新的主 ...

  8. Git远程仓库(github

    一.创建远程仓库(github) 首先到https://github.com注册一个账号,创建自己的Git,点击repositories,再点new 名字自定义,比如叫fansik,选择public点 ...

  9. jQuery 语法

    通过 jQuery,您可以选取(查询,query) HTML 元素,并对它们执行"操作"(actions). jQuery 语法实例 $(this).hide() 演示 jQuer ...

  10. PHP开发工具

    “工欲善其事,必先利其器”,进行PHP开发,选择一个合适的开发工具是必要的. 1.Zend Studio 如果对PHP开发工具进行一个排名,Zend Studio一定是当之无愧的第一名.它来自Zend ...