4.2模拟赛 wormhole(期望DP Dijkstra)
\(\color{white}{orzmjt又切题了...}\)
\(Description\)
给定一张有向图,每条边在每一时刻有\(p_i\)的概率存在。求最优策略下从\(1\)走到\(n\)最少需要多长时间。
\(n,m\leq10^5\)。
\(Solution\)
在八十中做过一道类似的题...(我都想不起那题是哪的了还是mjt想起来的orz)
令\(f_x\)表示\(x\)点到\(n\)点最少的期望花费时间。对比样例解释可以猜出能够想到,假设最优解中转移到\(x\)的点是\(v_1,v_2,...,v_k\),且这些点是按\(f_{v_i}\)从小到大排好序的,那么有$$f_x=p_{(x,v_1)}f_{v_1}+(1-p_{(x,v1)})p_{(x,v2)}f_{v_2}+...+\prod_{i=1}^k(1-p_{(x,v_i)})f_x$$
用\(Dijkstra\)转移就可以了(每次出队的一定已经是最优的\(f_v\),且是从小到大的。如果\(f_v\)能使\(f_x\)变小,就要\(v\),否则不管)。
考试的时候没判\(vis\),有双向边然后\(f[x]\)重复转移了 丢了一堆分mdzz。。
#include <queue>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define mp std::make_pair
#define pr std::pair<double,int>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5;
int Enum,H[N],nxt[N],to[N];
double P[N];
char IN[MAXIN],*SS=IN,*TT=IN;
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline void AE(double w,int u,int v)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, P[Enum]=w/100.0;
}
void Dijkstra(int n,int m)
{
static double f[N],sp[N];
static bool vis[N];
std::priority_queue<pr> q;
f[n]=0, q.push(mp(0,n));
for(int i=1; i<=n; ++i) sp[i]=1;
while(!q.empty())
{
int x=q.top().second; q.pop();
if(vis[x]) continue;
vis[x]=1;
if(x!=n) f[x]=(f[x]+1)/(1-sp[x]);
for(int i=H[x]; i; i=nxt[i])
{
int v=to[i]; if(vis[v]) continue;
double tmp=(f[v]+f[x]*sp[v]*P[i])/(1-sp[v]*(1-P[i]));
if(sp[v]==1||(f[v]+1)/(1-sp[v])>tmp) f[v]+=f[x]*sp[v]*P[i], sp[v]*=(1-P[i]), q.push(mp(-(f[v]+1)/(1-sp[v]),v));
}
}
printf("%.3f\n",f[1]);
}
int main()
{
freopen("wormhole.in","r",stdin);
freopen("wormhole.out","w",stdout);
int n=read(),m=read();
for(int i=1; i<=m; ++i) AE(read(),read(),read());
Dijkstra(n,m);
return 0;
}
4.2模拟赛 wormhole(期望DP Dijkstra)的更多相关文章
- 7.12 NOI模拟赛 探险队 期望 博弈 dp 最坏情况下最优策略 可并堆
LINK:探险队 非常难的题目 考试的时候爆零了 完全没有想到到到底怎么做 (当时去刚一道数论题了. 首先考虑清楚一件事情 就是当前是知道整张地图的样子 但是不清楚到底哪条边断了. 所以我们要做的其实 ...
- 6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
LINK:Decompose 看起来很难 实际上也很难 考验选手的dp 树链剖分 矩阵乘法的能力. 容易列出dp方程 暴力dp 期望得分28. 对于链的情况 容易发现dp方程可以转矩阵乘法 然后利用线 ...
- 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.
考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...
- Newnode's NOI(P?)模拟赛 第二题 dp决策单调优化
其实直接暴力O(n3)DP+O2O(n^3)DP+O_2O(n3)DP+O2优化能过- CODE O(n3)O(n^3)O(n3) 先来个O(n3)O(n^3)O(n3)暴力DP(开了O2O_2O2 ...
- 7.11 NOI模拟赛 graph 生成函数 dp 多项式
LINK:graph HDU题库里的原题 没做过自闭. 考虑dp 设\(f_{i,j}\)表示前i个点构成j个联通块是树的方案数. 对于一次询问答案即为\(\sum_{j}f_{n,j}j^k\) 考 ...
- 5.10 省选模拟赛 拍卖 博弈 dp
LINK:拍卖 比赛的时候 前面时间浪费的有点多 写这道题的时候 没剩多少时间了. 随便设了一个状态 就开始做了. 果然需要认真的思考.其实 从我的状态的状态转移中可以看出所有的结论. 这里 就不再赘 ...
- 5.12 省选模拟赛 T2 贪心 dp 搜索 差分
LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...
- 5.10 省选模拟赛 tree 树形dp 逆元
LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...
- 4.3 省选模拟赛 序列游戏 dp
可以发现 某一段被删除后状态难以表示 也难以链接起来. 考虑暴力 有40分的状压dp 暴力存状态 然后枚举转移即可.最后注意和f[0]这个状态取max 不然一分都没有. const int MAXN= ...
随机推荐
- sopUI上手教程
1.新建项目 File-->New SOAP Project-->Project Name:填入项目名 Initial WSDL:填入项目的 web Services 2.添加WSDL ...
- pytest 11 allure2生成html报告
allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面. 环境准备 1.pyt ...
- web.xml:<url-pattern>
web.xml 中的 <url-pattern> 是 <servlet-mapping> 或 <filter-mapping> 下的子标签. url :http:/ ...
- elk 中kafka启动脚本和配置文件
kafka启动脚本和配置文件 # more kafka #!/bin/sh # Init script for kafka ### BEGIN INIT INFO # Provides: kafka ...
- 我对SAP Business One 项目实施的理解
一.什么是SAP: 大家都知道ERP是什么,ERP是企业资源计划管理系统.是指建立在信息技术基础上,集信息技术与先进管理思想于一身,以系统化的管理思想,为企业员工及决策层提供决策手段的管理平台.那么问 ...
- Javaweb学习笔记——(二十七)——————泛型、泛型的通配符、反射泛型信息、反射注解、注解
泛型 1.泛型类:具有一个或多个类型变量的类,称之为泛型类 class A<T>{ } 2.在创建泛型实例时,需要为其类型变量赋值 A<String> a = new ...
- 定期清理WordPress的文章修订版本
当WordPress编辑或修改文章时会自动保存生成一个修订版本,默认是每分钟1次.方便恢复早先撰写的版本.不过时间一长就会产生大量的冗余数据,加重服务器负担,拖慢数据加载.当所有发布的文章都已更新到最 ...
- 第29月第2天 charles
1. https://www.jianshu.com/p/55a8c84e0f24
- 【转】构建高性能WEB站点之 吞吐率、吞吐量、TPS、性能测试
内容参考:构建高性能WEB站点.pdf 一.吞吐率 我们一般使用单位时间内服务器处理的请求数来描述其并发处理能力.称之为吞吐率(Throughput),单位是"req/s".吞吐率 ...
- 【转】Java中文乱码的解决
在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号. 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码, ...