zoukankan      html  css  js  c++  java
  • 【BZOJ 2306】 2306: [Ctsc2011]幸福路径 (倍增floyd)

    2306: [Ctsc2011]幸福路径

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 912  Solved: 437

    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)。

    Source

    【分析】

      无限长的路,但是p不断变小,所以做到足够精度也就可以了。

      然后就是,用倍增来搞floyd。

      $F[i][j][t]$表示从i走到j走了t步的最大收益,$F[i][j][t]=max(F[i][j][t-1]+F[i][j][t-1]*{p}^{t-1});$

      这个滚动DP啦~~

      做到$2^t$超越精度就好了。

      【表示其实初始化那里有点迷人,我是看po姐的。。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 #define Maxn 110
     8 #define Maxm 1100
     9 #define LL long long
    10 #define INF 0xfffffff
    11 const double eps=1e-8;
    12 
    13 double w[Maxn],f[Maxn][Maxn][2];
    14 double mymax(double x,double y) {return x>y?x:y;}
    15 
    16 int main()
    17 {
    18     int n,m,st;
    19     double p;
    20     scanf("%d%d",&n,&m);
    21     for(int i=1;i<=n;i++) scanf("%lf",&w[i]);
    22     scanf("%d%lf",&st,&p);
    23     memset(f,0xc2,sizeof(f));
    24     for(int i=1;i<=n;i++) f[i][i][0]=0;
    25     for(int i=1;i<=m;i++)
    26     {
    27         int x,y;
    28         scanf("%d%d",&x,&y);
    29         f[x][y][0]=w[y]*p;
    30     }
    31     int nw=0;
    32     for(double l=p;l>eps;l=l*l)
    33     {
    34         for(int i=1;i<=n;i++)
    35          for(int j=1;j<=n;j++)
    36             f[i][j][nw^1]=-INF;
    37         for(int k=1;k<=n;k++)
    38          for(int i=1;i<=n;i++)
    39           for(int j=1;j<=n;j++)
    40           {
    41              f[i][j][nw^1]=mymax(f[i][j][nw^1],f[i][k][nw]+f[k][j][nw]*l);
    42           }
    43         nw^=1;
    44     }
    45     double ans=0;
    46     for(int i=1;i<=n;i++) ans=mymax(ans,f[st][i][nw]);
    47     printf("%.1lf
    ",ans+w[st]);
    48     return 0;
    49 }
    View Code

    2017-04-05 15:56:06

  • 相关阅读:
    Scrum为什么不喜欢“来自客户的频繁变更”?
    [转]SQL Server计算列
    宽容,是创新的土壤
    【转载】《2010年年度总结》
    远程维护需要“千里眼”
    TOP语句放到表值函数外,效率异常低下
    “设计应对变化”实例讲解一个数据同步系统
    “批量少次”还是“少量多次”邮件通信系统效率浅谈
    NYOJ117 求逆序数
    NYOJ92 图像有用区域
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6669096.html
Copyright © 2011-2022 走看看