bupt spring training for 2015 #2nd J

题意

给两棵树,分别有 n,m 个节点(1 ≤ N, Q ≤ 4 × 10^4),等概率连接属于不同树的两个节点,求新树的直径(最远两点的距离)的期望。

题解

首先找每个点最远的距离,方法是第一次 dfs 找到树直径的一端,再从这个端点 dfs 找到直径的另一个端点,再从另一个端点 dfs 一遍,最远距离就是到两个端点的距离的较大值。

并且由两个端点也求出了树的直径 len,也就是一个端点到另一个端点的距离。

接下来对一棵树的每个点的最远距离数组 ds 排序,计算前缀和 s 。

然后对另一棵树每个点 i(下标是i+n),二分找出对方的树有多少个点的 ds 是不超过 len-ds[i+n]-1 的,则 i 和这些点相连时,\(ds[i+n]+1+ds[j]\leq len\),所以新直径是len,剩下的点新直径就是ds[i+n]+1+ds[j],用前缀和加快一下。最后除以n*m,因为是求期望。

代码

#include<bits/stdc++.h>
#define ll long long
#define N 100005
using namespace std;
struct edge{int to,next;}e[N<<1];
int head[N],cnt;
void add(int u,int v){e[cnt]=(edge){v,head[u]};head[u]=cnt++;}
void init(){memset(head,-1,sizeof head);cnt=0;}
int d[N],d2[N],ds[N];
int deep,dex;
ll s[N],ans;
void dfs(int x,int fa){
if(d[x]>=deep)deep=d[x],dex=x;
for(int i=head[x];~i;i=e[i].next){
int v=e[i].to;
if(v==fa)continue;
d[v]=d[x]+1;
dfs(v,x);
}
}
int getDep(int x,int ed){
deep=0;d[x]=0;dfs(x,0);
d[dex]=0;dfs(dex,0);
for(int i=x;i<=ed;++i)d2[i]=d[i];
d[dex]=0;dfs(dex,0);
for(int i=x;i<=ed;++i)ds[i]=max(d[i],d2[i]);
return deep;
}
int main(){
int n,m;
while(~scanf("%d%d",&n,&m)){
init();ans=0;
for(int u,v,i=1;i<n;++i)scanf("%d%d",&u,&v),add(u,v),add(v,u);
for(int u,v,i=1;i<m;++i)scanf("%d%d",&u,&v),add(u+n,v+n),add(v+n,u+n); int len=max(getDep(1,n),getDep(n+1,n+m)); sort(ds+1,ds+1+n);
for(int i=1;i<=n;++i)s[i]=s[i-1]+ds[i];
for(int i=1;i<=m;++i){
int b=lower_bound(ds+1,ds+1+n,len-ds[i+n]-1)-ds-1;
ans+=(ll)b*len+(ll)(n-b)*ds[i+n]+(n-b)+s[n]-s[b];
}
printf("%.3f\n",ans*1./(n*m));
}
return 0;
}

【UVALive - 6534 】Join two kingdoms (树的直径的期望)的更多相关文章

  1. 【UOJ #351】新年的叶子(树的直径,期望)

    题目链接 这的确是一道好题,我们不妨依循思路一步步推导,看问题是如何被解决的. 做一些约定,设$m$为树的叶子节点个数,设$len$为该树的直径(经过的点数). 毫无疑问,直径可能有多条,我们需要把所 ...

  2. Codeforces 804D Expected diameter of a tree(树的直径 + 二分 + map查询)

    题目链接 Expected diameter of a tree 题目意思就是给出一片森林, 若把任意两棵树合并(合并方法为在两个树上各自任选一点然后连一条新的边) 求这棵新的树的树的直径的期望长度. ...

  3. hdu-4612(无向图缩点+树的直径)

    题意:给你n个点和m条边的无向图,问你如果多加一条边的话,那么这个图最少的桥是什么 解题思路:无向图缩点和树的直径,用并查集缩点: #include<iostream> #include& ...

  4. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  5. poj2631 求树的直径裸题

    题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...

  6. poj1985 Cow Marathon (求树的直径)

    Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 3195   Accepted: 1596 Case ...

  7. VIJOS1476旅游规划[树形DP 树的直径]

    描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...

  8. poj2631 树的直径

    设s-t是这棵树的直径,那么对于任意给予的一点,它能够到达的最远的点是s或者t. 这样我们可以通过2次bfs找到树的直径了. #include<cstdio> #include<qu ...

  9. 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)

    1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1034  Solved: 562[Submit][St ...

随机推荐

  1. Selling Souvenirs CodeForces - 808E (分类排序后DP+贪心)

    E. Selling Souvenirs time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  2. hibernate 的sum(filed)引发的NullPointException错误解决过程

    背景: 在用hql语句进行sum查询时遭遇NPE问题: StringBuilder builder = new StringBuilder("select SUM(actualWorking ...

  3. P66 整环的零元

    R/I=0的零因子是0+I吗? 如果不是,那请问R/I的零因子是什么呢? R/I没有零因子 R/I的零元 是I中的元素定义的等价类 么  a是理想I的元素,自然也是R的元素

  4. 我的集合学习笔记--ArrayList

    一,ArrayList 实现自己的ArrayList:主要是添加方法,理解自动扩容机制 代码+注释 package com.amazing.jdk.learn2List.list_08_13; /** ...

  5. CI框架在模型中切换读写库和读写库

    如果你想在控制器中切换在application/config/database.php中配置好的数据库group,那么你可以参考这篇博客:CI框架在控制器中切换读写库和读写库 如果你是希望在模型中切换 ...

  6. 【学习总结】Git学习-参考廖雪峰老师教程一-Git简介

    学习总结之Git学习-总 目录: 一.Git简介 二.安装Git 三.创建版本库 四.时光机穿梭 五.远程仓库 六.分支管理 七.标签管理 八.使用GitHub 九.使用码云 十.自定义Git 期末总 ...

  7. Hibernate two table same id

    Hibernate更新数据(不用update也可以) - 森林木马 - 博客园 https://www.cnblogs.com/owenma/p/3481497.html hibernate级联更新会 ...

  8. react render

    实际上react render方法返回一个虚拟dom 并没有去执行渲染dom 渲染的过程是交给react 去完成的 这就说明了为什么要在所有数据请求完成后才去实现render 这样做也提高了性能.只调 ...

  9. mysql实现首字母从A-Z排序

    1.常规排序ASC DESC ASC 正序 DESC倒叙 -- 此处不用多讲 2.自定义排序 自定义排序是根据自己想要的特定字符串(数字)顺序进行排序.主要是使用函数 FIELD(str,str1,s ...

  10. ansible的playbook简单使用

    一.介绍 playbook就是一个用yaml语法把多个模块堆起来的一个文件 核心组件: Hosts:执行的远程主机列表Tasks:任务,由模块定义的操作的列表:Varniables:内置变量或自定义变 ...