题目大意:

一个有向图,图中有\(n\)个点\(m\)条边且无重边无自环,
每秒第\(i\)条边出现的概率是\(\frac{p[i]}{100}\),
一开始\(Samjia\)在\(1\)点,每一秒假设\(Samjia\)在点\(x\)上,
那么\(Samjia\)要从存在的边中选一条来走,不可以不走,
如果不存在可以走的边,那么\(Samjia\)就会\(gg\)(挂了),
假设\(Samjia\)绝顶聪明,问最后\(Samjia\)可以成功到达\(n\)的最大概率是多少。
.
输出只有一个实数表示答案,即最后\(Samjia\)可以成功到达n的最大概率,
你的答案与标准输出相差不超过\(1e-6\)即视为正确。
.
对于\(100\%\)的数据,\(2\leq n \leq 50,0\leq m\leq n*(n-1),0\leq p[i]\leq 100\)
一组数据:
input:
3 3
1 2 50
2 1 100
2 3 50
output:
0.333333333

思路及解法:

显然准确值是求不出来的(难不成你还微积分?),网上的正解都是 高斯消元调整法
然而这题其实可以不用这么高级的东西就可以水过去的(滑稽)。
首先假设我们也足够聪明,我们可以知道每个节点\(u\)的后继到达\(n\)的概率\(P_u\)。
那么一个非常显然的贪心就是我们先会去走成功概率大的点。
如果成功概率最大的点对应的那条边没有出现,我们则走成功概率次大的点。
其实转移已经出来了。
现在我们的问题是:我们不够聪明,不知道后续节点的成功概率。
然后正解的方法就是随便试一个排列,然后高斯消元(虽然我并不知道怎么搞)。
其实直接倒着转移不就行了吗?
没错,就是这样。

具体实现:

我们设\(f[t][u]\)表示从\(u\)点出发,用不超过\(t\)秒的时间成功到达\(n\)点的最大概率。
那么每次转移的时候,我们先把\(f[t-1]\)从大到小排一遍序(这不就是高斯消元要求的东西吗?)
然后考虑转移:非常显然:
\[f[t][u] = f[t][u] + f[t-1][v]*happen*pb[u][v]\]
其中\(pb[u][v]\)是\((u->v)\)这条边存在的概率,\(happen\)则是事件发生的概率。
那么关键是事件发生的概率\(happen\)怎么求。
由我们之前确定的贪心策略可以知道:
走向一个点发生的概率 为 连接 成功概率比它大的点 的边都不存在的概率
所以
\[happen_v = \prod_{r=1}^{n} (100\%-pb[u][r])*[\ f[t-1][r]>f[t-1][v]\ ]\]
一边 \(DP\) 一边处理即可。
至于精度要求的问题,其实是最简单的,跑个一两万遍精度不就符合要求了吗?

实现代码:

#include<bits/stdc++.h>
#define RG register
#define IL inline
using namespace std;

double pb[70][70];  int n,m;
struct F{double p; int id;}f[20005][70];
IL bool cmp(F a,F b){return a.p>b.p;}

int main(){
    cin >> n >> m;
    for(RG int i = 1; i <= m; i ++){
        RG double ppp; RG int xxx,yyy;
        cin >> xxx >> yyy >> ppp;
        pb[xxx][yyy] = 1.0*ppp/100;
    }
    for(RG int i = 1; i <= n; i ++)f[0][i] = (F){0,i};
    f[0][n] = (F){1,n};
    for(RG int i = 1; i <= 15000; i ++){
        f[i-1][n] = (F){1,n};
        sort(f[i-1]+1,f[i-1]+n+1,cmp);
        for(RG int u = 1; u <= n-1; u ++){
            f[i][u] = (F){0,u};
            RG double happen = 1;
            for(RG int j = 1; j <= n; j ++){
                RG int v = f[i-1][j].id;
                f[i][u].p += f[i-1][j].p*happen*pb[u][v];
                happen = happen*(1 - pb[u][v]);
            }
        }
    }
    printf("%.10lf",f[15000][1].p);  return 0;
}

[JZOJ5522] 图的更多相关文章

  1. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  2. PHP-生成缩略图和添加水印图-学习笔记

    1.开始 在网站上传图片过程,经常用到缩略图功能.这里我自己写了一个图片处理的Image类,能生成缩略图,并且可以添加水印图. 2.如何生成缩略图 生成缩略图,关键的是如何计算缩放比率. 这里,我根据 ...

  3. 火焰图分析openresty性能瓶颈

    注:本文操作基于CentOS 系统 准备工作 用wget从https://sourceware.org/systemtap/ftp/releases/下载最新版的systemtap.tar.gz压缩包 ...

  4. 一起来玩echarts系列(一)------箱线图的分析与绘制

    一.箱线图 Box-plot 箱线图一般被用作显示数据分散情况.具体是计算一组数据的中位数.25%分位数.75%分位数.上边界.下边界,来将数据从大到小排列,直观展示数据整体的分布情况. 大部分正常数 ...

  5. iOS开发系列--打造自己的“美图秀秀”

    --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...

  6. Webstorm+Webpack+echarts构建个性化定制的数据可视化图表&&两个echarts详细教程(柱状图,南丁格尔图)

    Webstorm+Webpack+echarts   ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(I ...

  7. SQLServer文件收缩-图形化+命令

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 收缩前 图形化演示: 不仅仅可以收缩日记文件,数据库文件也是可以收缩的,只不过日记收缩比 ...

  8. 冒泡,setinterval,背景图的div绑定事件,匿名函数问题

    1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...

  9. 用FSM一键制作逐帧动画雪碧图 Vue2 + webpack

    因为工作需要要将五六十张逐帧图拼成雪碧图,网上想找到一件制作工具半天没有找到,就自己用canvas写了一个. 写成之后就再没有什么机会使用了,因此希望有人使用的时候如果遇到bug了能及时反馈给我. 最 ...

随机推荐

  1. 针对Eclipse的maven Missing artifact com.microsoft.sqlserver:slqjdbc4:jar:4.0

    maven 中添加sqlserver 出错,报错内容 maven Missing artifact com.microsoft.sqlserver 解决方法这里先下载好jar包 ,然后maven命令执 ...

  2. 恢复linux系统文件夹颜色

    /etc/DIR_COLORS 默认值 # Background color codes:# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta ...

  3. UITableView 之 点击cell 实现两个自定义cell之间的切换

  4. win7本地连接消失

    可能原因一 驱动程序错误: 右键"计算机"图标 - "属性" - 设备管理器现在在设备管理器下面找到"网络适配器",在下面的网卡驱动中发现有 ...

  5. python函数的面向对象——面向对象设计

    通过几个函数式编号演进,理解面向对象设计 def01.py dog1 = { 'name':'元昊', 'gender':'母', 'type':'藏獒' } dog2 = { 'name':'李李' ...

  6. [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)

    减少分配率 这个几乎不用解释,减少了内存的使用量,自然就减少GC回收时的压力,同时降低了内存碎片与CPU的使用量.你可以用一些方法来达到这一目的,但它可能会与其它设计相冲突. 你需要在设计对象时仔细检 ...

  7. R学习笔记:了解R的使用

    R是一种区分大小写的解释性语言,只支持单行注释,注释由符号#开头,当前行出现在#之后的任何文本都会被R解释器忽略.R脚本的一次执行叫做一个会话(Session),可以通过函数quit()退出当前的会话 ...

  8. ContentProvider工作过程

    ContentProvider启动过程(通过query方法触发) ContentProvider.acquireProvider--> ApplicationContentResolver.ac ...

  9. cronatab周期性任务

    要执行周期性任务,要保证服务运行.服务名为crond:service crond start ; systemctl start crond; 配置文件 /etc/crontab cron的日志文件 ...

  10. linux 存储技术 部署iSCSI NFS Multipath多路径

    存储技术应用存储是根据不同的应用环境通过采取合理,安全,有效的方式将数据保存到某些介质上并能保证有效的访问另一方面,它是保证数据完整安全存放的方式或行为存储就是把这两方面结合起来,向客户提供一套数据存 ...