Portal --> hdu4035

Solution

  讲道理不是很懂为啥概d那么喜欢走迷宫qwq

  (推式子推的很爽的一题?)

  首先大力dp列式子

  用\(f[i]\)表示从\(i\)到离开的期望步数,\(du[i]\)表示\(i\)点的度数,那么可以得到:

\[f[i]=e_i* 0+k_i* f[1]+\frac{1-e_i-k_i}{du[i]}\sum(f[u]+1)
\]

  其中\(u\)是\(i\)的儿子

  稍微整理一下,对于叶子节点和普通节点我们可以分别得到这样的两条式子:

\[\begin{aligned}
&叶子:f[i]=k_i*f[1]+(1-e_i-k_i)*f[fa(i)]+(1-e_i-k_i)\\
\\
&普通:f[i]=k_i*f[1]+\frac{1-e_i-k_i}{du[i]}*f[fa(i)]+\frac{1-e_i-k_i}{du[i]}*\sum f[u]+(1-e_i-k_i)\\
\end{aligned}
\]

  考虑从下往上推,那么将\(f[u]\)看成常数的话,其实我们可以将\(f[i]\)表达为\(A_i*f[1]+B_i*f[fa(i)]+C_i\)这样的形式

  

  这个时候看一下我们要求的答案,可以表示成:\(f[1]=A_1*f[1]+B_1*0+C_1\)

  那也就是说,\(f[1]=\frac{C_1}{1-A_1}\)

  那。。所以其实到最后根本不需要求出所有的\(f\)值只要知道系数我们就可以直接把答案求出来了(大快人心事!)

  那剩下的就是要想办法把系数求出来

  

  化简一下上面的\(f\)的表达式

  我们发现\(\sum f[u]\)这个东西其实可以写成一个与\(f[i]\)相关的表达式(因为\(fa(u)=i\)),也就是:

\[\begin{aligned}
\sum f[u]&=\sum A_u*f[1]+B_u*f[i]+C_u
\end{aligned}
\]

  把这个式子带到上面普通节点的\(f\)值的表达式里面去,把跟\(f[i]\)有关的放一边,其他放另一边:

\[\begin{aligned}
f[i]&=k_i*f[1]+\frac{1-e_i-k_i}{du[i]}*f[fa(i)]+\frac{1-e_i-k_i}{du[i]}*(f[1]*\sum A_u+f[i]*\sum B_u+\sum C_u)\\
\\
(1-\frac{1-e_i-k_i}{du[i]}*\sum B_u)*f[i]&=(k_i+\frac{1-e_i-k_i}{du[i]}*\sum A_u)*f[1]+\frac{1-e_i-k_i}{du[i]}*f[fa(i)]+\frac{1-e_i-k_i}{du[i]}*(\sum C_u+du[i])
\end{aligned}
\]

  

  然后我们就可以得出\(、、A、B、C\)这三个系数的表达式啦

\[\begin{aligned}
叶子:&A_i=k_i\\
&B_i=1-e_i-k_i\\
&C_i=1-e_i-k_i\\
\\
普通:&A_i=(k_i+\frac{1-e_i-k_i}{du[i]}*\sum A_u)/(1-\frac{1-e_i-k_i}{du[i]}*\sum B_u)\\
&B_i=\frac{1-e_i-k_i}{du[i]}/(1-\frac{1-e_i-k_i}{du[i]}*\sum B_u)\\
&C_i=\frac{1-e_i-k_i}{du[i]}*(\sum C_u+du[i])/(1-\frac{1-e_i-k_i}{du[i]}*\sum B_u)\\
\end{aligned}
\]

  看上去长得。。挺丑。。但是!

  得出了这个式子之后我们就可以从下往上将所有的系数求出来了

​  

  然后就做完了

  那么无解是什么情况呢?应该就是在中间计算过程中,如果有哪一步算的时候除以\(0\)了就是无解了,中间算的时候判断一下就好了

  

  代码大概长这个样子

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int MAXN=1e4+10;
const double eps=1e-9;
struct xxx{
int y,nxt;
}a[MAXN*2];
int h[MAXN],du[MAXN];
double A[MAXN],B[MAXN],C[MAXN],k[MAXN],e[MAXN];
int n,m,tot,T;
void add(int x,int y);
bool dfs(int fa,int x);
void init(); int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int x,y;
double ans;
scanf("%d",&T);
for (int o=1;o<=T;++o){
printf("Case %d: ",o);
scanf("%d",&n);
init();
for (int i=1;i<n;++i){
scanf("%d%d",&x,&y);
add(x,y); add(y,x);
++du[x]; ++du[y];
}
for (int i=1;i<=n;++i){
scanf("%d%d\n",&x,&y);
k[i]=1.0*x/100.0;
e[i]=1.0*y/100.0;
}
if (dfs(0,1)){
if (fabs(1-A[1])<=eps) printf("impossible\n");
else
printf("%.6lf\n",C[1]/(1.0-A[1]));
}
else
printf("impossible\n");
}
} void init(){
tot=0;
memset(h,-1,sizeof(h));
memset(du,0,sizeof(du));
} void add(int x,int y){
a[++tot].y=y; a[tot].nxt=h[x]; h[x]=tot;
} bool dfs(int fa,int x){
int u,son=0;
double sum=0;
A[x]=k[x]; B[x]=(1.0-e[x]-k[x])/(1.0*du[x]); C[x]=du[x];
for (int i=h[x];i!=-1;i=a[i].nxt){
u=a[i].y;
if (u==fa) continue;
++son;
if (!dfs(x,u)) return false;
C[x]+=C[u];
A[x]+=(1.0-e[x]-k[x])/(1.0*du[x])*A[u];
sum+=B[u];
}
if (son==0){
A[x]=k[x]; B[x]=1.0-e[x]-k[x]; C[x]=1.0-k[x]-e[x];
}
else{
C[x]*=(1-e[x]-k[x])/(1.0*du[x]);
sum*=(1.0-e[x]-k[x])/(1.0*du[x]);
sum=1.0-sum;
if (fabs(sum)<eps) return false;
A[x]/=sum;
B[x]/=sum;
C[x]/=sum;
}
return true;
}

【hdu4035】Maze的更多相关文章

  1. 【CF123E】Maze

    Portal --> cf123E Solution 首先步数的话可以转化成每条边经过了几次这样来算 假设现在确定了起点\(S\)和终点\(T\),我们将\(T\)看成树根,那么考虑边\((u, ...

  2. 【XSY2525】Maze 2017多校

    Description 考虑一个 N×M 的网格,每个网格要么是空的,要么是障碍物.整个网格四周都是墙壁(即第1行和第n行,第1列和第m列都是墙壁),墙壁有且仅有两处开口,分别代表起点和终点.起点总是 ...

  3. 【南京邮电】maze 迷宫解法

    [南京邮电]maze 迷宫解法 题目来源:南京邮电大学网络攻防训练平台. 题目下载地址:https://pan.baidu.com/s/1i5gLzIt (密码rijss) 0x0 初步分析 题目中给 ...

  4. 【】maze

    [链接]点击打开链接 [题意] 小 T 被放到了一个迷宫之中,这个迷宫由 n 个节点构成,两个节点之间可能存在多条无 向边,小 T 的起点为 1 号节点,终点为 n 号节点.有 m 条无向边,对于每一 ...

  5. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  6. 【bfs】迷宫问题

    [题目描述] 定义一个二维数组: int maze[5][5] = { 0,1,0,0,0, 0,1,0,1,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,1,0, }; 它表示一个迷 ...

  7. 【HDOJ图论题集】【转】

    =============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...

  8. 【LeetCode】深搜DFS(共85题)

    [98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...

  9. 【LeetCode】BFS(共43题)

    [101]Symmetric Tree 判断一棵树是不是对称. 题解:直接递归判断了,感觉和bfs没有什么强联系,当然如果你一定要用queue改写的话,勉强也能算bfs. // 这个题目的重点是 比较 ...

随机推荐

  1. 获取json键值对的对应字符串

    获取json中的姓名 json串ac 关键字key public class Json { public static String json(String  key;String  ac) { JS ...

  2. 【java请求】- jmeter_jdbc脚本实战

    一,导入 使用Jmeter运行Java脚本,需要用到Jmeter的提供的框架jar包(分别在jmeter目录下的lib和ext目录下)1.ApacheJMeter_core.jar2.ApacheJM ...

  3. hdu - 6277,2018CCPC湖南全国邀请赛B题,找规律,贪心找最优.

    题意: 给出N个小时,分配这些小时去写若干份论文,若用1小时写一份论文,该论文会被引用A次,新写一篇论文的话,全面的论文会被新论文引用一次. 找最大的H,H是指存在H遍论文,而且这些论文各被引用大于H ...

  4. leetcode27_C++Remove Element

    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  5. 利用Tensorflow进行自然语言处理(NLP)系列之一Word2Vec

    同步笔者CSDN博客(https://blog.csdn.net/qq_37608890/article/details/81513882). 一.概述 本文将要讨论NLP的一个重要话题:Word2V ...

  6. kaldi DNN在线解码 aishell为例

    在kaldi 的工具集里有好几个程序可以用于在线识别.这些程序都位在src/onlinebin文件夹里,他们是由src/online文件夹里的文件编译而成(你现在可以用make ext 命令进行编译) ...

  7. Python 数据图表工具的比较

    Python 的科学栈相当成熟,各种应用场景都有相关的模块,包括机器学习和数据分析.数据可视化是发现数据和展示结果的重要一环,只不过过去以来,相对于 R 这样的工具,发展还是落后一些. 幸运的是,过去 ...

  8. 福大软工1816:Beta(6/7)

    Beta 冲刺 (6/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 组织会议 开发wxpy部分功能 展示G ...

  9. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

  10. 第二周:PSP&进度条

    PSP: 一.词频统计改进 1.表格:     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(hrs) 学习 <构建之法>.Java 8:46 1 ...