Description

有向图 G有n个顶点 1, 2, …, n,点i 的权值为 w(i)。现在有一只蚂蚁,从

给定的起点 v0出发,沿着图 G 的边爬行。开始时,它的体力为 1。每爬过一条

边,它的体力都会下降为原来的 ρ 倍,其中ρ 是一个给定的小于1的正常数。而

蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值的乘积。

我们把蚂蚁在爬行路径上幸福度的总和记为 H。很显然,对于不同的爬行路

径,H 的值也可能不同。小 Z 对 H 值的最大可能值很感兴趣,你能帮助他计算

吗?注意,蚂蚁爬行的路径长度可能是无穷的。

Input

每一行中两个数之间用一个空格隔开。

输入文件第一行包含两个正整数 n, m,分别表示 G 中顶点的个数和边的条

数。

第二行包含 n个非负实数,依次表示 n个顶点权值 w(1), w(2), …, w(n)。

第三行包含一个正整数 v0,表示给定的起点。

第四行包含一个实数 ρ,表示给定的小于 1的正常数。

接下来 m行,每行两个正整数 x, y,表示<x, y>是G的一条有向边。可能有

自环,但不会有重边。

Output

仅包含一个实数,即 H值的最大可能值,四舍五入到小数点后一位。

Sample Input

5 5

10.0 8.0 8.0 8.0 15.0

1

0.5

1 2

2 3

3 4

4 2

4 5

Sample Output

18.0

题解

当走无限步时 , 答案会很快到达一个临界值 , 这个值趋于不变 , 因为这个时候的p已经很小了,对答案的贡献很小 , 所以可以设定一个极大的步数 , 求出走完这么多步之后的答案 ,

考虑倍增floyd , 设\(f[t][i][j]\) 表示从i出发走了 \(2^t\) 到达j 的贡献,转移方程是

\(f[t][i][j] = max(f[t][i][j] , f[t-1][i][k] + f[t-1][k][j] * p ^ {2 ^ {t-1}}\)

倍增一下就好。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 110;
inline int read()
{
register int x = 0 , f = 0; register char c = getchar();
while(c < '0' || c > '9') f |= c == '-' , c = getchar();
while(c >= '0' && c <= '9') x = (x << 3) + (x << 1) + c - '0' , c = getchar();
return f ? -x : x;
}
int n , m , S , cnt;
double p;
int head[N];
double a[N] , f[N][N] , g[N][N] , t[N][N];
struct edge{ int v , nex; } e[N*10];
inline void add(int u , int v) { e[++cnt].v = v; e[cnt].nex = head[u]; head[u] = cnt; return ; } void mul(int K)
{
for(int i = 1 ; i <= n ; ++i) for(int j = 1 ; j <= n ; ++j) g[i][j] = t[i][j] = f[i][j] , f[i][j] = -1e8;
for(int k = 1 ; k <= n ; ++k) // 我之前居然傻到没有枚举 k……
for(int i = 1 ; i <= n ; ++i)
for(int j = 1 ; j <= n ; ++j)
f[i][j] = max(f[i][j] , g[i][k] + t[k][j] * p);
return ;
} double ksm(int k)
{
for(int i = 1 ; i <= k ; ++i) mul(i) , p = p * p;
double ans = 0;
for(int i = 1 ; i <= n ; ++i) ans = max(ans , f[S][i]);
return ans + a[S];
} int main()
{
n = read(); m = read();
for(int i = 1 ; i <= n ; ++i) scanf("%lf" , &a[i]);
S = read(); scanf("%lf" , &p);
for(int i = 1 ; i <= n ; ++i) for(int j = 1 ; j <= n ; ++j) f[i][j] = (i == j ? 0 : -1e8); // 没有的要赋成-inf , 要不然就会用本来没有的边 , 更新答案。
for(int i = 1 , u , v; i <= m ; ++i) u = read() , v = read() , add(u , v) , f[u][v] = a[v] * p;
printf("%.1f\n" , ksm(30));
return 0;
}

BZOJ 2306: [Ctsc2011]幸福路径的更多相关文章

  1. 【BZOJ 2306】 2306: [Ctsc2011]幸福路径 (倍增floyd)

    2306: [Ctsc2011]幸福路径 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 912  Solved: 437 Description 有向 ...

  2. BZOJ2306: [Ctsc2011]幸福路径

    Description 有向图 G有n个顶点 1, 2, -, n,点i 的权值为 w(i).现在有一只蚂蚁,从 给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条 边,它 ...

  3. BZOJ2306:[CTSC2011]幸福路径(倍增Floyd)

    Description 有向图 G有n个顶点 1,  2, …,  n,点i 的权值为 w(i).现在有一只蚂蚁,从给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条边,它 ...

  4. [CTSC2011]幸福路径

    题目描述 有向图 G有n个顶点 1, 2, …, n,点i 的权值为 w(i).现在有一只蚂蚁,从 给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条 边,它的体力都会下降 ...

  5. 【bzoj2306】[Ctsc2011]幸福路径 倍增Floyd

    题目描述 一张n个点的有向图,每个点有一个权值.一开始从点$v_0$出发沿图中的边任意移动,移动到路径上的第$i$个点 输入 每一行中两个数之间用一个空格隔开. 输入文件第一行包含两个正整数 n,  ...

  6. bzoj2306 [Ctsc2011]幸福路径 倍增 Floyd

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2306 题解 倍增 Floyd. 令 \(f[i][j][k]\) 表示走了 \(2^i\) 步 ...

  7. BZOJ2306 [Ctsc2011]幸福路径[倍增]

    这个有环的情况非常的讨厌,一开始想通过数学推等比数列的和,但是发现比较繁就不做了. 然后挖掘这题性质. 数据比较小,但是体力可以很接近1(恼怒),也就是说可能可以跳很多很多步.算了一下,大概跳了2e7 ...

  8. 【BZOJ2306】幸福路径(动态规划,倍增)

    [BZOJ2306]幸福路径(动态规划,倍增) 题面 BZOJ 题解 不要求确切的值,只需要逼近 显然可以通过移动\(\infty\)步来达到逼近的效果 考虑每次的一步怎么移动 设\(f[i][j]\ ...

  9. BZOJ 2337 XOR和路径 | 高斯消元 期望 位运算

    BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这 ...

随机推荐

  1. 如何通过adb command 完成自动SD卡升级?

    如何通过adb command 完成自动SD卡升级? 原创 2014年09月09日 10:50:57 2746 通过adb 命令的方式,免去了按powerkey+volumeup进入menu sele ...

  2. 解决github图片不显示的问题

    修改hosts C:\Windows\System32\drivers\etc\hosts 在文件末尾添加: # GitHub Start 192.30.253.112 Build software ...

  3. B树(B-树) 、B+树

    B树(B-树) 1.B-树(B树)的基本概念B-树中所有结点中孩子结点个数的最大值成为B-树的阶,通常用m表示,从查找效率考虑,一般要求m>=3.一棵m阶B-树或者是一棵空树,或者是满足以下条件 ...

  4. MySQL中的索引、左连接、右连接、join、sql执行顺序

    逻辑架构: 1.连接层 2.服务层 3.引擎层(插拔式) 4.存储层 存储引擎: 常用的有:MyISAM.InnoDB 查看命令:show variables like '%storage_engin ...

  5. Android获取CPU编号

    /** * 获取CPU序列号 * * @return CPU序列号(16位) * 读取失败为"0000000000000000" */ private static String ...

  6. Cesium案例解析(四)——3DModels模型加载

    目录 1. 概述 2. 代码 3. 解析 4. 参考 1. 概述 Cesium自带的3D Models示例,展示了如何加载glTF格式三维模型数据.glTF是为WebGL量身定制的数据格式,在网络环境 ...

  7. 关于mac下redis的安装和部署

    近来学习scrap分布式,需要用到redis,但以前没接触过,所以记录一下自己的安装过程. 准备:Mac,redis-5.0.4.tar.gz 1.压缩包到官网下(建议下载稳定版)网址:redis.i ...

  8. opencv —— resize、pyrUp 和 pyrDown 图像金字塔(高斯金字塔、拉普拉斯金字塔)与尺寸缩放(向上采样、向下采样)

    我们经常会将某种尺寸的图像转化为其他尺寸的图像,如果需要放大或者缩小图像的尺寸,在 OpenCV 中可以使用如下两种方法: resize 函数,最直接的方法. pyrUp 和 pyrDown 函数,即 ...

  9. linux操作系统搭建测试环境

    环境:linux操作系统.tomcat服务器.mysql数据库.火狐浏览器 工具:secureCRT.FileZalla 一.安装vmware虚拟机 二.在虚拟机上安装linux操作系统,参考http ...

  10. CSS背景说明及连写

    一.CSS背景说明 CSS 可以添加背景颜色和背景图片,以及来进行图片设置. 1.1 背景图片(image) background-image 属性允许指定一个图片展示在背景中(只有CSS3才可以多背 ...