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 }
  • 相关阅读:
    Azure HPC Pack Cluster添加辅助节点
    Azure HPC Pack 辅助节点模板配置
    Azure HPC Pack配置管理系列(PART6)
    Windows HPC Pack 2012 R2配置
    Azure HPC Pack 节点提升成域控制器
    Azure HPC Pack VM 节点创建和配置
    Azure HPC Pack 部署必要条件准备
    Azure HPC Pack 基础拓扑概述
    Azure VM 性能计数器配置
    Maven私仓配置
  • 原文地址:https://www.cnblogs.com/wfj2048/p/7501019.html
Copyright © 2011-2022 走看看