【Ctsc2011】幸福路径

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2306



给定一张有向图,每个点有权值,蚂蚁从某个节点出发,初始体力值为$1$,每走一条边$体力值*=p$,每经过一个点会获得幸福值为$点权*体力值$,求最大幸福值。即求

${\sum _{i=0}^{\infty }w[i]*p^{i}}$且${U(i-1,i)=1}$其中${U(A,B)}$表示是否存在A到B这样一条路径。



正解是一个叫做倍增Floyed的东西。

其实就是说考虑到步数是可以走无限步的,我们只需要知道一个近似值,而精度要求也还是比较高的,考虑用倍增的方法快速确定精度。
令${f[i][j][k]}$表示从第$i$个点走到第$j$个点,期间走了${2^{k}}$步。

那么可以利用Floyed进行如下转移:
$${f[i][j][k]=max(\forall (f[i][t][k-1]+f[t][j][k-1]*p^{2^{k}}))}$$

注意$k$这一维是可以滚动的。


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<cstring>
 8 using namespace std;
 9 #define maxn 110
10 #define inf 0x7fffffff
11 #define llg long long
12 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
13 llg n,m,S;
14 double p,ans,a[maxn],f[maxn][maxn],g[maxn][maxn],tmp;
15 int main()
16 {
17     yyj("a");
18     cin>>n>>m;
19     for (llg i=1;i<=n;i++) scanf("%lf",&a[i]);
20     cin>>S>>p;
21     for (llg i=1;i<=n;i++)
22         for (llg j=1;j<=n;j++)
23             if (i!=j) f[i][j]=inf*-1;
24     for (llg i=1;i<=m;i++)
25     {
26         llg x,y;
27         scanf("%lld%lld",&x,&y);
28         f[x][y]=a[y];
29     }
30     llg T=50;
31     double tmp=p;
32     while (T--)
33     {
34         //tmp*=tmp;
35         for (llg i=1;i<=n;i++)
36             for (llg j=1;j<=n;j++)
37                 if (i!=j) g[i][j]=inf*-1;
38         for (llg k=1;k<=n;k++)
39             for (llg i=1;i<=n;i++)
40                 for (llg j=1;j<=n;j++)
41                     g[i][j]=max(g[i][j],f[i][k]+f[k][j]*tmp);
42         memcpy(f,g,sizeof f);
43         tmp*=tmp;
44     }
45     for (llg i=1;i<=n;i++) ans=max(ans,f[S][i]);
46     printf("%.1lf\n",ans*p+a[S]);
47     return 0;
48 }
时间: 2024-10-14 11:02:38

【Ctsc2011】幸福路径的相关文章

bzoj2306: [Ctsc2011]幸福路径(倍增+Floyed 逼近答案)

www.cnblogs.com/shaokele/ bzoj2306: [Ctsc2011]幸福路径 Time Limit: 10 Sec Memory Limit: 256 MB Description 有向图 G有n个顶点 1, 2, -, n,点i 的权值为 w(i).现在有一只蚂蚁,从给定的起点 v0出发,沿着图 G 的边爬行.开始时,它的体力为 1.每爬过一条边,它的体力都会下降为原来的 ρ 倍,其中ρ 是一个给定的小于1的正常数.而蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值

BZOJ 2306 Ctsc2011 幸福路径 倍增Floyd

题目大意:给定一张有向图,每个点有权值,蚂蚁从某个节点出发,初始体力值为1,每走一条边体力值*=p,每经过一个点会获得幸福值为点权*体力值,求最大幸福值 令f[i][j][t]为从点i走到点j花2^t步的最大幸福值 那么有f[i][j][t]=max{f[i][k][t-1]+f[k][j][t-1]*p^(2^t)} 迭代多次即可得到答案的近似值 注意蚂蚁可能卡死在某个点不动,因此初始要将邻接矩阵清为-INF,然后每个点连一条边权为0的自环 此外注意下卡死时最后经过的那个点的权值会不会被统计

CTSC2011 幸福路径

给定?张有向图,每个点有个权值,蚂蚁从某个点开始,初始体?为1,每经过?条边,体?会变为原来的p(0<p<1)倍,每爬到?个点,获得的幸福度为该点的权值乘上体?.求蚂蚁幸福度的最?值,保留?位?数. $n \leq 100,点权 \leq 100$ sol: 正解是自动机的泵引理,一看就不可做,考虑暴力碾标算 由于点权不超过 100,体力很小的时候点权的贡献也很小,保留一位小数就会把很小的贡献舍去 做一个 dp 设 $f_{(i,j,k)}$ 表示走了 $i$ 步,从 $j$ 走到 $k$ 的

BZOJ2306 [Ctsc2011]幸福路径

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:BZOJ2306 正解:倍增+floyd 解题报告: 这道题很有意思啊... 显然不能直接算贡献,考虑概率衰减的很快,我们可以做到一定的次数就视为得到了最优解,精度够了就行. 而这个$floyd$的过程可以用倍增加速,考虑用$f[t][i][j]

BZOJ 2306 幸福路径(DP)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2306 题意:给出一个有向图,点有权值 a.初始时在点S.一个人在初始点能量为K=1,每走到下一个点能量值乘以p(p<1),到达一个点u 幸福度为 a[u]*K.求最大的幸福度. 思路:最后必然是走了一条链,或者是一个环(一直绕),或者是一条链加一个环.设f[i][j][k]表示从点j走了i步到达节点k的最大幸福度.那么f[i][j][j]就表示在绕环.那么在这个环上一直绕下去的期望为:

幸福路径

[问题描述] 有向图G有n个顶点1, 2, …, n,点i的权值为w(i).现在有一只蚂蚁,从给定的起点v0出发,沿着图G的边爬行.开始时,它的体力为1.每爬过一条边,它的体力都会下降为原来的ρ倍,其中ρ是一个给定的小于1的正常数.而蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值的乘积. 我们把蚂蚁在爬行路径上幸福度的总和记为H.很显然,对于不同的爬行路径,H的值也可能不同.小Z对H值的最大可能值很感兴趣,你能帮助他计算吗?注意,蚂蚁爬行的路径长度可能是无穷的. [输入格式] 输入文件为p

bzoj2306 幸福路径 倍增 Floyd

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2306 题意:一张有向图,每个点有一个权值$w(x)$,给出路径起点求出最大$f(x)=sigma(w(x)*p)$,其中,$p$初始值为$1$,每走一步这个值都会乘上另一个给出的常量. 由于这个题精度要求极低(只有$1e-1$),所以我们直接迭代求值即可. 但是如果我们这么一步一步搞肯定会$T$……这时候我们就需要用一些黑科技:倍增.我们每次倍增前进,前进的时候在每一层做一次$Floyd$,

[BZOJ] 幸福路径

bzoj 2306 最短路水题,多次迭代就可以求得答案. 我在这里迭代了100下,应该很安全了orz #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int N = 110; int n,m,s; double ans,g[N][N],a[N],f[N][N],p

待 题表

题表 达哥终极杂题表Bzoj2839 hdu6021 Codeforces 804DBzoj2248 hdu5575 Codeforces 786CBzoj2013 bzoj2676 Codeforces 803CBzoj2386 bzoj3782 Codeforces 813DBzoj2699 cogs1667 Codeforces 814DBzoj4798 bzoj2064 Codeforces 814EBzoj4639 bzoj3505 Codeforces 815ABzoj4417 bz