TYVJ P1933 绿豆蛙的归宿 题解(未完成)
2016-07-01 23:45
295 查看
P1933「Poetize3」绿豆蛙的归宿时间:1000ms/空间:131072KiB/Java类名:Main44121132233344
背景
随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。描述
给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。绿豆蛙从起点出发,走向终点。到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为1/K。现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?输入格式
第一行:两个整数NM,代表图中有N个点、M条边第二行到第1+M行:每行3个整数abc,代表从a到b有一条长度为c的有向边输出格式
从起点到终点路径总长度的期望值,四舍五入保留两位小数。测试样例1
输入
输出
备注
对于20%的数据N<=100对于40%的数据N<=1000对于60%的数据N<=10000对于100%的数据N<=100000,M<=2*N——————我是华丽丽的分割线——————————————数学期望DP好题,难题。很费解。#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<cstdlib> #include<iomanip> #include<cassert> #include<climits> #definemaxn10001 #defineF(i,j,k)for(inti=j;i<=k;i++) #defineM(a,b)memset(a,b,sizeof(a)) #defineFF(i,j,k)for(inti=j;i>=k;i--) #defineinf0x7fffffff usingnamespacestd; intread(){ intx=0,f=1;charch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} returnx*f; } structedge{ intto,w,next; }p[200010]; inttot,n; inthead[100010]; voidaddedge(inta,intb,intc){ p[tot].to=b; p[tot].w=c; p[tot].next=head[a]; head[a]=tot++; } doubledp[100010]; intout[100010],q[100010]; intout1[100010]; intmain() { std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y; //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); intm,a,b,c; cin>>n>>m; M(head,-1); while(m--){ cin>>a>>b>>c; addedge(b,a,c); out[a]=++out1[a]; } ints=0,e=-1; q[++e]=n; while(s<=e){ s++; intu=q[s]; for(inti=head[u];i!=-1;i=p[i].next){ intv=p[i].to; dp[v]+=(dp[u]+p[i].w)/out[v]; if(--out1[v]==0)q[++e]=v; } } cout<<setiosflags(ios::fixed)<<setprecision(2)<<dp[1]; cout<<endl; return0; }ViewCode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<iomanip>
#include<cassert>
#include<climits>
#definemaxn10001
#defineF(i,j,k)for(inti=j;i<=k;i++)
#defineM(a,b)memset(a,b,sizeof(a))
#defineFF(i,j,k)for(inti=j;i>=k;i--)
#defineinf0x7fffffff
usingnamespacestd;
intread(){
intx=0,f=1;charch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
returnx*f;
}
structedge{
intto,w,next;
}p[200010];
inttot,n;
inthead[100010];
voidaddedge(inta,intb,intc){
p[tot].to=b;
p[tot].w=c;
p[tot].next=head[a];
head[a]=tot++;
}
doubledp[100010];
intout[100010],q[100010];
intout1[100010];
intmain()
{
std::ios::sync_with_stdio(false);//cout<<setiosflags(ios::fixed)<<setprecision(1)<<y;
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
intm,a,b,c;
cin>>n>>m;
M(head,-1);
while(m--){
cin>>a>>b>>c;
addedge(b,a,c);
out[a]=++out1[a];
}
ints=0,e=-1;
q[++e]=n;
while(s<=e){
s++;
intu=q[s];
for(inti=head[u];i!=-1;i=p[i].next){
intv=p[i].to;
dp[v]+=(dp[u]+p[i].w)/out[v];
if(--out1[v]==0)q[++e]=v;
}
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<dp[1];
cout<<endl;
return0;
}CC++C++11JavaPascalPython2.7Python3.3RubyC#VB.NetF#
相关文章推荐
- 为该目录以及子目录添加index.html
- 4000 Oracle游标的使用方法以及使用for循环实现游标的原理
- plsql结构定义,复合类型,行类型和列类型,逻辑控制语句
- 生成 SSH 公钥
- TensorFlow文本与序列的深度模型
- oracle对象【约束,序列,索引,视图,同义词】
- Activiti Designer实现排他网关
- 2016.7总结 培训 培训+培训
- Python 语言及其应用 Chapter_4_Note_1 推导式
- NBU 2430 war of energy
- 2016.7总结 培训 培训+培训
- TYVJ-P1864 守卫者的挑战 题解
- Active Directory域服务
- Java编程题目-3:字符串自定义encode(),decode()
- Android之WebView网页滚动截图
- $resoure服务的简单学习
- python匹配ip正则
- postfix 添加sasl 认证
- 实用的摩斯编码
- 查看系统联系人列表选择联系人后返回姓名和电话