【UVALive - 6534 】Join two kingdoms (树的直径的期望)
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 (树的直径的期望)的更多相关文章
- 【UOJ #351】新年的叶子(树的直径,期望)
题目链接 这的确是一道好题,我们不妨依循思路一步步推导,看问题是如何被解决的. 做一些约定,设$m$为树的叶子节点个数,设$len$为该树的直径(经过的点数). 毫无疑问,直径可能有多条,我们需要把所 ...
- Codeforces 804D Expected diameter of a tree(树的直径 + 二分 + map查询)
题目链接 Expected diameter of a tree 题目意思就是给出一片森林, 若把任意两棵树合并(合并方法为在两个树上各自任选一点然后连一条新的边) 求这棵新的树的树的直径的期望长度. ...
- hdu-4612(无向图缩点+树的直径)
题意:给你n个点和m条边的无向图,问你如果多加一条边的话,那么这个图最少的桥是什么 解题思路:无向图缩点和树的直径,用并查集缩点: #include<iostream> #include& ...
- 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分
树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...
- poj2631 求树的直径裸题
题目链接:http://poj.org/problem?id=2631 题意:给出一棵树的两边结点以及权重,就这条路上的最长路. 思路:求实求树的直径. 这里给出树的直径的证明: 主要是利用了反证法: ...
- poj1985 Cow Marathon (求树的直径)
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 3195 Accepted: 1596 Case ...
- VIJOS1476旅游规划[树形DP 树的直径]
描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...
- poj2631 树的直径
设s-t是这棵树的直径,那么对于任意给予的一点,它能够到达的最远的点是s或者t. 这样我们可以通过2次bfs找到树的直径了. #include<cstdio> #include<qu ...
- 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)
1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1034 Solved: 562[Submit][St ...
随机推荐
- MySQL和Oracle的区别
由于SQL Server不常用,所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写 ...
- javaweb之Cookie学习
Cookie简介 HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时,买了一条裤子, ...
- shell脚本--操作MySQL数据库
其实就是一个很简单的套路,和其他语言差不多,首先连接数据库,然后在进行其他操作. 套路如下: #!/bin/bash mysql="mysql -uroot -proot" #连接 ...
- 【学习总结】GirlsInAI ML-diary day-3-数据类型
[学习总结]GirlsInAI ML-diary 总 原博github链接-day3 数据类型 熟悉一下计算时可能碰到的数据类型.(计算时...) 1-打开jupyter,new一个新python文件 ...
- Centos 7 关闭selinux and firewall
关闭selinx,重启生效 修改文件 /etc/selinux/config 修改 SELINUX=disabled getenforce #查selinux状态 setenforce #关闭seli ...
- laravel get和all区别
get ,all 都可以获取到模型 all 是直接获取所有,get 是在添加了许多约束之后获取模型,get前面如果不加约束条件的话,效果与all等同
- 120. 单词接龙 (BFS)
描述 给出两个单词(start和end)和一个字典,找到从start到end的最短转换序列 比如: 每次只能改变一个字母. 变换过程中的中间单词必须在字典中出现. 如果没有转换序列则返回0. 所有单词 ...
- day 7-4 互斥锁与队列
一. 基本定义 互斥锁(英语:英语:Mutual exclusion,缩写 Mutex)是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制.该目的通过将代码切片成一个 ...
- python爬虫之git的使用(origin说明)
1.首先我们回忆两个命令 #git remote add origin 远程仓库链接 #git push -u origin master 我们一起看看这个命令,git是git的一级命令,push就是 ...
- python之路--MySQL数据库初识
一 . MySQL安装 # 下载MySQL地址 https://dev.mysql.com/downloads # 要选稳定的,不要选最新的,稳定的就是半年以上没有出现过bug 现在5.6.43为绝大 ...