【bzoj2360】【cstc2011】【幸福路径】【倍增+floyd】

原创 2015年11月21日 16:46:00

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

HINT

对于 100%的数据, n ≤ 100, m ≤ 1000, ρ ≤ 1 – 10^-6

, w(i) ≤ 100 (i = 1, 2, …, n)。

题解:用f[i][j][k]表示从i走到j走2^k步的最大值。

           则f[i][j][k]=max(f[i][j][k],f[i][p][k-1]+f[p][j][k-1]*p^(2^(k-1));

因为本题对精度要求不是很高,所以倍增上30遍即可得到正确答案。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 110
using namespace std;
double f[N][N],g[N][N],a[N],t,p,ans;
int n,m,st,x,y; 
int main(){  
  scanf("%d%d",&n,&m);
  for (int i=1;i<=n;i++) scanf("%lf",&a[i]);
  scanf("%d%lf",&st,&p);
  memset(f,-20,sizeof(f));
  for (int i=1;i<=m;i++){scanf("%d%d",&x,&y);f[x][y]=a[y];}
  t=p;            
  for (int q=1;q<=30;q+=1,t*=t){
    for (int i=1;i<=n;i++)
      for (int j=1;j<=n;j++)
        g[i][j]=f[i][j];
    for (int k=1;k<=n;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]+g[k][j]*t);
   }
  for (int i=1;i<=n;i++) ans=max(ans,f[st][i]);
  printf("%.1lf",ans*p+a[st]);  
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

BZOJ 2306 [Ctsc2011] 幸福路径 [倍增+floyd做法]

倍增+floyd

bzoj 2306 幸福路径 【floyd】【dp】

期望值最大的dp,转移有环 开始在想强连通分量缩点之后,块内高斯消元+拓扑图dp。 但是高斯消元没有max的转移。 所以用了处理有环最大值的方法:floyd 总结一下: 处理转移有环的方法:...

BZOJ2306/Ctsc2011 幸福路径

BZOJ2306/CTSC 2011 幸福路径

【BZOJ2085】【Poi2010】Hamsters AC自动机bfs+倍增floyd

题解: 首先我们搞个 ACAC 自动机,然后每个串在 ACAC 自动机上 bfsbfs 求出 f(i,j)f(i,j) 表示串 ii 后面最少接 f(i,j)f(i,j) 个字母能搞出来串 jj 。...

BZOJ 2085 [Poi2010]Hamsters Hash+倍增floyd

BZOJ 2085 [Poi2010]Hamsters Hash+倍增floyd

BZOJ 2085 Poi2010 Hamsters Hash+倍增Floyd

题目大意:给定n个长度总和不超过10W的字符串,求一个最短的母串,使所有字符串的出现次数之和=m 这n个字符串保证不互相包含 TM能不能好好翻译了 令f[i][j]表示第i个字符串后面接上第j个字...

BZOJ 1706 usaco2007 Nov relays 奶牛接力跑 倍增Floyd

题目大意:给定一张无向图,求从s出发恰好经过n条边到达e的最短路 倍增Floyd……为何大家都管这个叫做矩阵乘法- - 算了为何要纠结这种事- - 令f[p][i][j]表示走2^p步从i到达j的...

BZOJ 2165 大楼 倍增Floyd

题目大意:给定一张图,求从1开始到达m的权值至少需要遍历多少条边 n f[temp][i][j]表示经过2^temp条边从i走到j的最大权值 更新时f[temp[i][j]=max{f[temp...

bzoj 1706: [usaco2007 Nov]relays 奶牛接力跑(倍增floyd)

1706: [usaco2007 Nov]relays 奶牛接力跑 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 675  Solved: 352 [S...

BZOJ 2165 大楼 倍增Floyd

题目大意:给出一个有向图,问总路径长度>=k最少需要经过多少边。 思路:记录几个辅助数组,f[p][i][j]表示走2^p步时最长的路径是多少。g[i][j]表示目前从i到j最长路是多长。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)