【bzoj2306】[Ctsc2011]幸福路径 倍增Floyd
题目描述
一张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的更多相关文章
- bzoj2306 [Ctsc2011]幸福路径 倍增 Floyd
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2306 题解 倍增 Floyd. 令 \(f[i][j][k]\) 表示走了 \(2^i\) 步 ...
- BZOJ2306:[CTSC2011]幸福路径(倍增Floyd)
Description 有向图 G有n个顶点 1, 2, …, n,点i 的权值为 w(i).现在有一只蚂蚁,从给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条边,它 ...
- BZOJ2306 [Ctsc2011]幸福路径[倍增]
这个有环的情况非常的讨厌,一开始想通过数学推等比数列的和,但是发现比较繁就不做了. 然后挖掘这题性质. 数据比较小,但是体力可以很接近1(恼怒),也就是说可能可以跳很多很多步.算了一下,大概跳了2e7 ...
- BZOJ2306: [Ctsc2011]幸福路径
Description 有向图 G有n个顶点 1, 2, -, n,点i 的权值为 w(i).现在有一只蚂蚁,从 给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条 边,它 ...
- 【BZOJ 2306】 2306: [Ctsc2011]幸福路径 (倍增floyd)
2306: [Ctsc2011]幸福路径 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 912 Solved: 437 Description 有向 ...
- 【BZOJ2306】幸福路径(动态规划,倍增)
[BZOJ2306]幸福路径(动态规划,倍增) 题面 BZOJ 题解 不要求确切的值,只需要逼近 显然可以通过移动\(\infty\)步来达到逼近的效果 考虑每次的一步怎么移动 设\(f[i][j]\ ...
- [CTSC2011]幸福路径
题目描述 有向图 G有n个顶点 1, 2, …, n,点i 的权值为 w(i).现在有一只蚂蚁,从 给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条 边,它的体力都会下降 ...
- BZOJ 2306: [Ctsc2011]幸福路径
Description 有向图 G有n个顶点 1, 2, -, n,点i 的权值为 w(i).现在有一只蚂蚁,从 给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条 边,它 ...
- bzoj2165: 大楼(倍增floyd)
题目大意:一个有向图,n(<=100)个点求一条长度>=m(<=10^18)的路径最少经过几条边. 一开始以为是矩乘,蓝鹅当时还没开始写,所以好像给CYC安利错了嘿嘿嘿QWQ 第一眼 ...
随机推荐
- 前端jQuery之事件流
1.事件流概念 描述的是从页面中接收事件的顺序 包含事件捕获阶段,处于目标阶段,事件冒泡阶段 2.绑定事件 语法 bind(type,data,fn) 示例:每个标签被点击的时候,弹出其文本 $(&q ...
- singnal 13 was raised
在app运行过程中按下home键或者其他原因app被挂起,socket连接不会断开,服务器为了节省资源,在一段时间后会主动关闭这个连接.当玩家再次切回到游戏后,前端并不知道这个连接已经断开了,继续通过 ...
- 最大公约数(gcd模板)
int gcd(int a,int b) { ) { int t=a%b; a=b; b=t; } return a; }
- FastDFS文件管理系统
一.FastDFS介绍 FastDFS 是一个开源的高性能分布式文件系统(DFS). 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡.主要解决了海量数据存储问题,特别适合以中小文 ...
- linux系统批量创建用户和生成8位随机密码
1.1 脚本案例 批量创建20个用户,用户名为user1-user20,并生成8位随机登录密码,用户组采用键盘输入的方式,并将用户名及登录密码保存到/tmp/create_user.txt普通文 ...
- while循环,格式化输出,运算符
1.while循环 1.while 基本机构: while 条件: 循环体 执行流程: 当条件成立时为真,执行循环体. 再次判断条件是否成立,如果成立再次执行. 当判断条件结果为假时,跳出循环,本 ...
- Oracle 11g R2在 win7 64位的安装流程图解【含常见问题解决方案】
ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一.Oracle 11 ...
- linux学习(3)——vim文本编辑工具
(三) vi与vim的最大区别就是编辑一个文本vi不显示颜色,vim显示颜色. 安装: yum install -y vim-enhance Vim有三种模式 A:一般模式 上下左右光标 k j h ...
- POJ:3040-Allowance(贪心好题)
Allowance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4903 Accepted: 1943 Description ...
- python面向对象三大特性
面向对象的三大特性: 封装.继承和多态 一.封装 封装,顾名思义就是将内容封装到某个地方,以后可以直接调用被封装到某处的内容. - 将内容封装到某处 - 从某处调用被封装的内容 第一步,将内容封装到某 ...