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. Nice Garland CodeForces - 1108C (思维+暴力)

    You have a garland consisting of nn lamps. Each lamp is colored red, green or blue. The color of the ...

  2. Spring AOP详细介绍

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  3. php-fpm-运行原理(转)

    转载自https://studygolang.com/articles/15073 php-fpm是一种master(主)/worker(子)多进程架构,与nginx设计风格有点类似.master进程 ...

  4. 牛客OI周赛8-普及组

    https://ac.nowcoder.com/acm/contest/543#question A. 代码: #include <bits/stdc++.h> using namespa ...

  5. js-其他跨域技术(JSONP`Comet)

    ###1.  JSONP JSONP由两部分组成:回调函数和数据 JSONP是通过动态<script>元素来使用的,使用时可以为src属性指定一个跨域URL eg: function ha ...

  6. K8S集群 NOT READY的解决办法 1.13 错误信息:cni config uninitialized

    今天给同事 一个k8s 集群 出现not ready了 花了 40min 才搞定 这里记录一下 避免下载 再遇到了 不清楚. 错误现象:untime network not ready: Networ ...

  7. java中间缓存变量机制

    public static void main(String[] args){ int j = 0; for(int i = 0; i < 100; i++) j = j++; System.o ...

  8. 移动端Web界面滚动touch事件

    解决办法一: elem.addEventListener( 'touchstart', fn, { passive: false } ); 解决办法二: * { touch-action: pan-y ...

  9. 从主机A得到id_rsa.pub文件,在主机B创建用户danny加入该文件,实现主机A免密登录主机B

    操作步骤: 1.主机A 生成公钥id_rsa.pub文件并导出该文件 root@mytest:~# ssh-keygen Generating public/private rsa key pair. ...

  10. PHP金额工具类之将阿利伯数字转换为大写中文数字

    1.将阿拉伯数字转换为中文大写数字 <?php namespace core\components; class PriceHelper extends \yii\base\Component{ ...