您的位置:首页 > 其它

TYVJ P1933 绿豆蛙的归宿 题解(未完成)

2016-07-01 23:45 295 查看
P1933「Poetize3」绿豆蛙的归宿时间:1000ms/空间:131072KiB/Java类名:Main

背景

随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。

描述

给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。绿豆蛙从起点出发,走向终点。到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为1/K。现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?

输入格式

第一行:两个整数NM,代表图中有N个点、M条边第二行到第1+M行:每行3个整数abc,代表从a到b有一条长度为c的有向边

输出格式

从起点到终点路径总长度的期望值,四舍五入保留两位小数。

测试样例1

输入

44121132233344

输出

7.00

备注

对于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#清空代码
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航