一棵树,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. Exercise 24: More Practice

    puts "Let's practice everything." puts 'You\'d need to know \'bout escapes with \\ that do ...

  2. POJ 2318

    题目来源:http://poj.org/problem?id=2318 题目内容:给定一个矩形盒子(左上和右下端点的坐标),再给定n条线段,将盒子分为n+1份,之后给定m个点的坐标,对于盒子的每一段, ...

  3. JDK1.7 安装配置

    JDK1.7 安装配置 1.下载jdk1.7安装包,下载地址为http://pan.baidu.com/s/1bnvWc5x: 2.安装jdk1.7,安装完成后可在安装目录下看到以下两个文件夹,如下图 ...

  4. 论文ei,sci检索,JCR-SCI分区,中科院分区连接

    https://jcr.incites.thomsonreuters.com/JCRJournalHomeAction.action?SID=B1-bQgax2FJ7EsyZ9muP6O5loc77S ...

  5. Spring mvc shiro 整合

    参考 : http://www.360doc.com/content/14/0722/10/18637323_396209195.shtml http://www.360doc.com/content ...

  6. javax.el.PropertyNotFoundException:

    javax.el.PropertyNotFoundException: Property 'ContextPath' not found on type org.apache.catalina.cor ...

  7. C#的数组

    一维数组: 定义数组 int[] 变量名=new int [n]; 例一:输入班级人数,再输入每个人的姓名. 例二:输入班级人数,输入每个人的分数,求平均分 冒泡排序: 二维数组: 定义二维数组 in ...

  8. UNITY更新到5后设置的动画无法播放了怎么办

    点击对应的animator,将 apply root motion  这个选项的勾去掉就可以了,纠结了很久最后在UNITY官方论坛找到的答案

  9. 2016HUAS_ACM暑假集训3G - 还是畅通工程

    最小生成树,题目简单.套的Prim模板,其他的题目比较有意义. Sample Input 3                             //村庄个数1 2 1               ...

  10. 不能从const char *转换为LPCWSTR

    编译器有时候会根据编码方式来选择定义为LPCWSTR还是LPCTSTR LPSTR: 32bit指针 指向一个字符串,每个字符占1字节. 相当于 char *   LPCSTR: 32-bit指针 指 ...