题目描述

YJC最近在学习图的有关知识。今天,他遇到了这么一个概念:随机游走。随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次。YJC很聪明,他很快就学会了怎么跑随机游走。为了检验自己是不是欧洲人,他决定选一棵树,每条边边权为1,选一对点s和t,从s开始随机游走,走到t就停下,看看要走多长时间。但是在走了10000000步之后,仍然没有走到t。YJC坚信自己是欧洲人,他认为是因为他选的s和t不好,即从s走到t的期望距离太长了。于是他提出了这么一个问题:给一棵n个点的树,问所有点对(i,j)(1≤i,j≤n)中,从i走到j的期望距离的最大值是多少。YJC发现他不会做了,于是他来问你这个问题的答案。

数据范围

对于30%的数据,满足n≤5。

对于50%的数据,满足n≤3000。

对于100%的数据,满足n≤100000。

解法

预处理出每条边的期望长度;

然后树形动态规划。

代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
const char* fin="rw.in";
const char* fout="rw.out";
const int inf=0x7fffffff;
const int maxn=100007,maxm=maxn*2;
int n,i,j,k;
int fi[maxn],la[maxm],ne[maxm],tot;
int f[maxn],g[maxn];
int h[maxn][4],ans,id[maxn][4];
void add_line(int a,int b){
tot++;
ne[tot]=fi[a];
la[tot]=b;
fi[a]=tot;
}
void getf(int v,int from){
int i,j=0,k;
for (k=fi[v];k;k=ne[k]) j++;
f[v]=j;
for (k=fi[v];k;k=ne[k])
if (la[k]!=from){
getf(la[k],v);
f[v]+=f[la[k]];
}
}
void getg(int v,int from){
int i,j=0,k;
for (k=fi[v];k;k=ne[k])
if (la[k]!=from) j+=1+f[la[k]];
else j+=1+g[v];
for (k=fi[v];k;k=ne[k])
if (la[k]!=from){
g[la[k]]=j-f[la[k]];
getg(la[k],v);
}
}
void dfs(int v,int from){
int i,j,k;
h[v][0]=h[v][1]=h[v][2]=h[v][3]=0;
for (k=fi[v];k;k=ne[k])
if (la[k]!=from){
dfs(la[k],v);
i=g[la[k]]+h[la[k]][0];
j=f[la[k]]+h[la[k]][1];
if (i>h[v][0]){
id[v][0]=la[k];
h[v][2]=h[v][0];
h[v][0]=i;
}else h[v][2]=max(h[v][2],i);
if (j>h[v][1]){
id[v][1]=la[k];
h[v][3]=h[v][1];
h[v][1]=j;
}else h[v][3]=max(h[v][3],j);
}
if (id[v][0]!=id[v][1]) ans=max(ans,h[v][0]+h[v][1]);
else ans=max(ans,max(h[v][0]+h[v][3],h[v][2]+h[v][1]));
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d",&n);
for (i=1;i<n;i++){
scanf("%d%d",&j,&k);
add_line(j,k);
add_line(k,j);
}
getf(1,0);
getg(1,0);
dfs(1,0);
printf("%d.00000",ans);
return 0;
}

启发

从固定长度开始推期望值。

【JZOJ4890】【NOIP2016提高A组集训第14场11.12】随机游走的更多相关文章

  1. 【NOIP2016提高A组集训第14场11.12】随机游走

    题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...

  2. 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP

    好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ...

  3. 【JZOJ4889】【NOIP2016提高A组集训第14场11.12】最长公共回文子序列

    题目描述 YJC最近在学习字符串的有关知识.今天,他遇到了这么一个概念:最长公共回文子序列.一个序列S,如果S是回文的且分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已 ...

  4. 【JZOJ4888】【NOIP2016提高A组集训第14场11.12】最近公共祖先

    题目描述 YJC最近在学习树的有关知识.今天,他遇到了这么一个概念:最近公共祖先.对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. ...

  5. JZOJ 【NOIP2016提高A组集训第16场11.15】兔子

    JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...

  6. JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线

    JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...

  7. 【JZOJ4893】【NOIP2016提高A组集训第15场11.14】过河

    题目描述 数据范围 解法 由于同一个点,同一个圆盘最多只会走一次. 把(i,j)当作一个点,表示第i个点,放第i个圆盘. 那么就可以使用最短路. 时间复杂度为O(n4∗k). 事实上存在冗余圆盘,一个 ...

  8. 【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...

  9. 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...

随机推荐

  1. CentOS 6.5 服务器相关配置

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 #配置网卡 ONBOOT=YES #静态IPBOOTPROTO=static #启用地址协议 --static ...

  2. Windows下shell神器

    想找一个可以在Windows平台玩命令行的东西,不想装虚拟机搞linux,所以找到两个神器 如何升级Babun中的Git Babun中默认已经集成Git,只是有可能不是最新的版本 如果只是更新Babu ...

  3. Linux Shell脚本经典案例

    开头加解释器:#!/bin/bash    语法缩进,使用四个空格:多加注释说明.    命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用.    默认变量是全局的,在函数中变量 ...

  4. 如何在 Flink 1.9 中使用 Hive?

    Apache Flink 从 1.9.0 版本开始增加了与 Hive 集成的功能,用户可以通过 Flink 来访问 Hive 的元数据,以及读写 Hive 中的表.本文将主要从项目的设计架构.最新进展 ...

  5. LR11中web_save_timestamp_param

    时间戳是现在时间减去现在的时间 减去 1970年1月1日0点00 的时间 ,然后换算成毫秒. 所以我们需要借助 web_save_timestamp_param 来实现. web_save_times ...

  6. CodeChef August Lunchtime 2014 题解

    A题 给一个由a和b两种类型的字符组成的字符串,每次可以从中选取任意长度的回文子序列(不一定连续)并删除.问最少需要几次能将整个字符串为空. 思路:如果本身是个回文串,那么只需要一次,否则需要两次(第 ...

  7. mybatis深入理解(一)-----Mybatis初始化机制详解

    对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. 一. MyBatis的初始化做了什么 1.configuration ...

  8. 直接在安装了redis的Linux机器上操作redis数据存储类型--对key的操作

    一.概述:   前几篇博客中,主要讲述的是与Redis数据类型相关的命令,如String.List.Set.Hashes和Sorted-Set.这些命令都具有一个共同点,即所有的操作都是针对与Key关 ...

  9. 关于python的列表操作(二):排序,统计

    # 列表操作 num_list = [2, 5, 8, 6, 7, 9, 5, 7] # 升序 num_list.sort() print(num_list) # 降序 num_list.sort(r ...

  10. Django 的学习(2) 从adminuser到配置

    创建一个superuser python manage.py createsuperuser 然后是密码邮箱用户名 You should see a few types of editable con ...