[JZOJ5522] 图
2018-01-15 17:10
183 查看
Description
这个世界是一个有向图,图中有n个点m条边且无重边无自环,每秒第i条边出现的概率是p[i]/100,一开始Samjia在1点,每一秒假设Samjia在点x上,那么Samjia要从存在的边中选一条来走,不可以不走,如果不存在可以走的边,那么Samjia就会掉出这个世界,假设Samjia绝顶聪明,问最后Samjia可以成功到达n的概率是多少。一个实数表示答案,即最后Samjia可以成功到达n的概率,你的答案与标准输出相差不超过1e-6即视为正确。
对于100%的数据,2<=n<=50,0<=m<=n*(n-1),0<=p[i]<=100
Solution
这题比较玄令Fi表示i这个点到n的概率
可以发现转移与F之间的相对顺序有关,然而我们并不清楚F
考虑暴力,枚举F的大小关系,然后列方程高斯消元,判断是否正确
然后有两种做法
我们知道如果走的步数特别大了以后对答案的影响就可以忽略不计了
设F[i][j]表示当前在i这个点,走了不超过j步能到达n的最大概率
显然F
[0~INF]=1
倒过来转移,每次将步数相同的排个序,这样就可以转移了
走10000步就能满足精度要求
第二种是出题人的方法
先随便弄出一种排列方案,高斯消元弄出答案,然后基于调整的思路,每次用新的排列继续做,直到新的排列和这一次的排列相同,那就是最终答案了
Code
#include <cstdio> #include <iostream> #include <algorithm> #include <cstdlib> #include <cstring> #include <cmath> #define N 52 #define LL long long #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) using namespace std; int n,m; double pr ; struct nd { double v; int w; friend bool operator <(nd x,nd y) { return x.v>y.v; } }f[10005] ; int main() { cin>>n>>m; fo(i,1,m) { int x,y,c; scanf("%d%d%d",&x,&y,&c); pr[x][y]=c/100.0; } memset(f[0],0,sizeof(f[0])); f[0] .v=1,f[0] .w=n; double ans=0; fo(l,1,10000) { f[l-1] .v=1,f[l-1] .w=n; sort(f[l-1]+1,f[l-1]+n+1); fo(k,1,n-1) { f[l][k].w=k,f[l][k].v=0; double vl=1; fo(i,1,n) { int p=f[l-1][i].w; f[l][k].v+=f[l-1][i].v*pr[k][p]*vl; vl*=1-pr[k][p]; } } } printf("%.6lf\n",f[10000][1].v); }
相关文章推荐
- [JZOJ5522]. 图
- [JZOJ5522] 图
- 【时光回溯】【JZOJ3567】【GDKOI2014】石油储备计划
- 【JZOJ4799】我的快乐时代
- 【JZOJ 4809】【NOIP2016提高组 五校联考1】挖金矿
- 【JZOJ 4810】道路规划
- JZOJ 4811. 排队(线段树的方法)
- NOIP提高组【JZOJ4815】ksum
- {题解}[jzoj4817]【NOIP2016提高A组五校联考4】square
- 【JZOJ4819】算循环
- JZOJ 4823. 【NOIP2016提高A组集训第1场10.29】小W学物理
- 【JZOJ 4823】小W学物理
- [JZOJ4838]I Like Matrix!
- JZOJ4848 永恒的契约
- 【JZOJ4859】【NOIP2016提高A组集训第7场11.4】连锁店
- JZOJ4870. 【NOIP2016提高A组集训第9场11.7】涂色游戏
- 【JZOJ4876】基因突变
- 【JZOJ4886】【NOIP2016提高A组集训第13场11.11】字符串
- JZOJ 4840. 【NOIP2016提高A组集训第4场11.1】小W砍大树