【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]);  
}


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

Floyd算法求最短路径并记录路径

基本模型从最开始只允许经过1号顶点中转,接下来允许经过1号和2号中转……..允许经过1~n号所有的顶点进行中转,求任意两点间的最短路程。用一句话概括就是:从i号顶点到j号顶点之经过前k号的最短路程。实...
  • nghuyong
  • nghuyong
  • 2016年12月19日 13:11
  • 2721

POJ1734(floyd求最小环的路径)

题目:Sightseeing trip   题意:求一个图中最小环,输出路径。 #include #include #include using namespace std; ...
  • ACdreamers
  • ACdreamers
  • 2013年07月10日 16:16
  • 2203

最短路径问题---Floyd算法详解

前言 Genius only means hard-working all one’s life. Name:Willam Time:2017/3/81、最短路径问题介绍问题解释: 从图中的...
  • qq_35644234
  • qq_35644234
  • 2017年03月11日 17:01
  • 21734

Floyd算法 及 递归输出路径

这里不重点分析Floyd最短路径算法,主要分享一下自己路径的输出。 Floyd算法其实有用到Dijkstra的思想,都是找到中间节点作跳板,更新点到点的最短路径。Floyd有用到前面确定的最短路径,如...
  • qq_33728573
  • qq_33728573
  • 2016年12月17日 20:11
  • 1599

简单实现dijstra算法和floyd算法并打印所有最短路径

#include #include #include #include #include #include #include using namespace std; typede...
  • wocaoqwerty
  • wocaoqwerty
  • 2014年09月12日 18:05
  • 256

多源最短路径( Floyd算法)JAVA实现

多源最短路径( Floyd算法)JAVA实现 package floyd; public class Graph { final int max=100; /* * 顶点节点 */...
  • Coder_py
  • Coder_py
  • 2017年05月24日 13:43
  • 605

最短路径Dijkstar算法和Floyd算法详解(c语言版)

用这两个算法做了半年多的题了,刚开始学的时候以为很懂了,直到今天数据结构课上,我才真正的明白了,下面我来详解这两个算法。 先说说Dijkstra吧,这种算法只能求单源最短路径,那么什么是单源最短路径呢...
  • Dinivity123
  • Dinivity123
  • 2013年11月27日 16:46
  • 3956

Floyd_任意点之间的最短路径算法

一、算法介绍:  Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法。从表面上粗看,Floyd算...
  • u013148406
  • u013148406
  • 2016年09月24日 14:34
  • 1513

Geeks面试题:Floyd Warshall Algorithm 所有顶点之间的最短路径问题

就是严慧敏的数据结构书上的图论介绍的所有顶点之间的最短路径问题。 不过书上没有说是使用动态规划法做这道题的,也就说的并不透切。 记得当年钻研这本书的时候,觉得本题十分难理解,半天没搞明白,然后后来反复...
  • kenden23
  • kenden23
  • 2014年01月24日 08:07
  • 3208

Floyd算法求图最短路径及实现

最短路径搜索是基于Floyd算法的改进。Floyd算法的基本思想 图1 选i到j的最短路径 Floyd算法的基本思想是:比较直接从i到j和从i经k到j的路径长度,选择较短的一条。当此条最短路径选...
  • LoHiauFung
  • LoHiauFung
  • 2016年12月06日 15:51
  • 1323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【bzoj2360】【cstc2011】【幸福路径】【倍增+floyd】
举报原因:
原因补充:

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