zoukankan      html  css  js  c++  java
  • bzoj2306 [Ctsc2011]幸福路径

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

    正解:倍增+$floyd$。

    注意到$p^{k}$的取值,当$k$很大时$p^{k}$会很小。

    所以我们可以卡一下,当$p$很小时就可以直接退出了。

    写一个倍增+$floyd$就行了,每次用松弛点的最大值来更新一条路。

     1 #include <bits/stdc++.h>
     2 #define il inline
     3 #define RG register
     4 #define ll long long
     5 #define ld long double
     6 #define inf (1e30)
     7  
     8 using namespace std;
     9 
    10 ld f[110][110],g[110][110],w[110],p,ans;
    11 int n,m,S;
    12 
    13 int main(){
    14 #ifndef ONLINE_JUDGE
    15   freopen("happy.in","r",stdin);
    16   freopen("happy.out","w",stdout);
    17 #endif
    18   cin>>n>>m; for (RG int i=1;i<=n;++i) cin>>w[i]; cin>>S>>p;
    19   for (RG int i=1;i<=n;++i) for (RG int j=1;j<=n;++j) f[i][j]=-inf;
    20   for (RG int i=1;i<=n;++i) f[i][i]=0;
    21   for (RG int i=1,x,y;i<=m;++i) cin>>x>>y,f[x][y]=w[y]*p;
    22   for (RG ld P=p;P>1e-10;P*=P){
    23     for (RG int i=1;i<=n;++i) for (RG int j=1;j<=n;++j) g[i][j]=-inf;
    24     for (RG int k=1;k<=n;++k)
    25       for (RG int i=1;i<=n;++i)
    26     for (RG int j=1;j<=n;++j)
    27       g[i][j]=max(g[i][j],f[i][k]+P*f[k][j]);
    28     memcpy(f,g,sizeof(g));
    29   }
    30   for (RG int i=1;i<=n;++i) ans=max(ans,f[S][i]);
    31   printf("%0.1Lf
    ",w[S]+ans); return 0;
    32 }
  • 相关阅读:
    测试用例设计--边界值
    测试用例设计--等价类划分
    实战JAVA虚拟机 JVM故障诊断与性能优化(八)
    Centos-Mysql远程访问
    实战JAVA虚拟机 JVM故障诊断与性能优化(七)
    实战JAVA虚拟机 JVM故障诊断与性能优化(六)--->JConsole And Visual VM
    实战JAVA虚拟机 JVM故障诊断与性能优化(六)
    jdk 1.8 VisualVM 插件 地址 变更
    实战JAVA虚拟机 JVM故障诊断与性能优化(七)--->无处不在的字符串:String在虚拟机中的实现
    本地git项目,push到github上
  • 原文地址:https://www.cnblogs.com/wfj2048/p/7501019.html
Copyright © 2011-2022 走看看