题目描述

一张n个点的有向图,每个点有一个权值。一开始从点$v_0$出发沿图中的边任意移动,移动到路径上的第$i$个点

输入

每一行中两个数之间用一个空格隔开。 
输入文件第一行包含两个正整数 n,  m,分别表示 G 中顶点的个数和边的条
数。 
第二行包含 n个非负实数,依次表示 n个顶点权值 w(1), w(2), …, w(n)。 
第三行包含一个正整数 v0,表示给定的起点。 
第四行包含一个实数 ρ,表示给定的小于 1的正常数。 
接下来 m行,每行两个正整数 x, y,表示<x, y>是G的一条有向边。可能有
自环,但不会有重边。

输出

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

样例输入

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

样例输出

18.0


题解

倍增Floyd

先把点权加到指向这个点的边上,然后设$f[i][j][k]$表示经过$i$条边,从$j$到$k$的最大收益。

那么状态转移方程显然是一个类似Floyd的东西。

由于可以在任意一个点停下,所以在每个点处连一个权值为0的自环。

这个矩阵的无穷次方(Floyd)即为所求。

由于$p<1$,所以$p$的足够多次方可以近似看作0。因此可以倍增Floyd,让这个矩阵倍增50次,相当于p进行了50次平方操作,接近0,可以达到精度要求。

最后加上起点统计答案即可。

时间复杂度$O(50n^3)$

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
double w[110] , f[55][110][110];
int main()
{
int n , m , s , i , j , k , l , x , y;
double p , ans = 0;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ ) scanf("%lf" , &w[i]);
scanf("%d%lf" , &s , &p);
memset(f , 0xc2 , sizeof(f));
for(i = 0 ; i <= 50 ; i ++ )
for(j = 1 ; j <= n ; j ++ )
f[i][j][j] = 0;
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &x , &y) , f[0][x][y] = p * w[y];
for(i = 1 ; i <= 50 ; i ++ , p = p * p)
for(j = 1 ; j <= n ; j ++ )
for(k = 1 ; k <= n ; k ++ )
for(l = 1 ; l <= n ; l ++ )
f[i][j][k] = max(f[i][j][k] , f[i - 1][j][l] + p * f[i - 1][l][k]);
for(i = 1 ; i <= n ; i ++ )
ans = max(ans , w[s] + f[50][s][i]);
printf("%.1lf\n" , ans);
return 0;
}

【bzoj2306】[Ctsc2011]幸福路径 倍增Floyd的更多相关文章

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

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

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

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

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

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

  4. BZOJ2306: [Ctsc2011]幸福路径

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

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

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

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

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

  7. [CTSC2011]幸福路径

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

  8. BZOJ 2306: [Ctsc2011]幸福路径

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

  9. bzoj2165: 大楼(倍增floyd)

    题目大意:一个有向图,n(<=100)个点求一条长度>=m(<=10^18)的路径最少经过几条边. 一开始以为是矩乘,蓝鹅当时还没开始写,所以好像给CYC安利错了嘿嘿嘿QWQ 第一眼 ...

随机推荐

  1. JavaSE 面试题总结

    一. JavaSE 4 1. 面向对象的特征有哪些方面 4 2. String是最基本的数据类型吗? 4 3. super()与this()的区别? 4 4. JAVA的事件委托机制和垃圾回收机制 4 ...

  2. 基于mybatis设计简单信息管理系统---jsp页面

    1.在设计编辑界面的时候需要有一个下拉的列表页,想要他指定到指定的值: <select id="categoryId" name="categoryId" ...

  3. Percona-Tookit工具包之pt-sift

      Preface       We've got a lot of files related with system performance which generated by pt-stalk ...

  4. nodejs 发送邮件(阿里云)

    1.下载  模块 2.  编辑文件 var nodemailer = require('nodemailer'); var sendEmail = function(emailinfo,callbac ...

  5. 腾讯云负载均衡CLB

    负载均衡 使用场景: ①购买一个负载均衡LB实例 ②一级.二级域名都解析到VIP上 ③创建HTTP/HTTPS监听器 ④绑定云主机 在nginx中只需要配置好伪静态和相关设置就ok了

  6. a链接打开另外的新页面

    在a标签添加target = "_blank" 属性即可

  7. VM12虚拟机安装os x 10.11系统以及注意事项

    一.安装步骤 原文链接:https://blog.csdn.net/soachenshui/article/details/49251513 https://blog.csdn.net/soachen ...

  8. intellij idea 添加动态 user library(java.lang.VerifyError)【转】

    使用IDEA的时候有时要用到eclipse的user library,由于两个IDE导入library的方式不同导致我们找不到导入user library的方法. 查IDEA的官方文档,找到方法如下: ...

  9. laravel环境配置的常见问题

    从开始下载相关软件到现在,整整一天,终于成功了.不得不说官方的说明文档相当详细,毕竟我都成功了,不是吗,哈哈. 好了,不多说了,直接上干货 官方环境配置文档地址:https://laravel-chi ...

  10. vue 改变我们插值的符号{{}}改为${}

    delimiters的作用是改变我们插值的符号.Vue默认的插值是双大括号{{}}.但有时我们会有需求更改这个插值的形式. delimiters:['${','}'] 现在我们的插值形式就变成了${} ...