\(\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;
}

最新文章

  1. Hbuilder开发HTML5 APP之打开新页面
  2. Devexpress TileNavPane 控件的使用
  3. 【转】25个必须记住的SSH命令
  4. BZOJ1565: [NOI2009]植物大战僵尸
  5. Win10年度更新开发必备:VS2015 Update 3正式版下载汇总
  6. 你需要管理员权限才能删除文件夹及服务器C盘不及批处理
  7. Berkeley 四种产品如何选择?
  8. EasyMock的原理及使用方法
  9. Mysql在php5中的应用
  10. Yii console 创建命令行应用
  11. 本地化SilverLight应用程序(多语言支持)
  12. 揭密: M2和高房价到底谁推高了谁?
  13. Java设计模式菜鸟系列(十四)代理模式建模与实现
  14. Python traceback的优雅处理
  15. tomcat环境变量详细配置步骤
  16. MongoDB AUTH结果验证及开启方法
  17. RocketMQ 简单梳理 及 集群部署笔记
  18. Python redis 简单介绍
  19. Java编写准备数据源
  20. C++ 和 Java 对类继承的差异

热门文章

  1. 第五篇-ubuntu下插入U盘,显示可读系统。
  2. FreeNAS:创建 CIFS 匿名共享
  3. 微服务之路由网关—zuul
  4. 分布式监控系统开发【day38】:报警策略设计(二)
  5. 液晶流在齐次 Besov 空间中的正则性准则
  6. Gram 矩阵与向量到子空间的距离
  7. jsonp简介
  8. 线程的start方法和run方法的区别
  9. C#(在WeBAPI)获取Oracle(在PL/SQL)游标类型的存储过程(用到了RefCursor)
  10. Arduino语言介绍