wikioi 2488 绿豆蛙的归宿(拓扑排序求期望)

2488 绿豆蛙的归宿
时间限制: 1 s
空间限制: 64000 KB
题目等级 : 黄金 Gold
题解
题目描述 Description
  随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。

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

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

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

样例输入 Sample Input
4 4
1 2 1
1 3 2
2 3 3
3 4 4

样例输出 Sample Output
7.00

数据范围及提示 Data Size & Hint
  对于20%的数据 N<=100
  对于40%的数据 N<=1000
  对于60%的数据 N<=10000
  对于100%的数据 N<=100000,M<=2*N

所谓求期望值,无非就是把每条边走的可能性乘以它的权值,求和而已
所以关键就是怎么确定每条边的可能性大小,这是我们想到拓扑排序,相同可能的
k条路径各占1/k的可能。。。。。
具体看代码:

program df;
type point=^node;
node=record
date,ends:longint;
next:point;
end;

var i,j,n,m,x,y,z:longint;
s,k:real;
f:array[0..200000] of real; //记录这条边的走的可能性
d,tm:array[0..200000] of longint;
path:array[0..200000] of point;
procedure com(x,y,z:longint);
var i:point;
begin
i:=path[x];
new(path[x]);
path[x]^.date:=z;
path[x]^.ends:=y;
path[x]^.next:=i;
end;
procedure bfs(x:longint);
var i:point;
h,t,u:longint;
begin
h:=0; t:=1; tm[1]:=x;
repeat
inc(h);
u:=tm[h];
i:=path[u];
if d[u]<>0 then
k:=f[u]/d[u]; //在此前边的基础上,当前所占可能性(f[u]为当前的可能性,d[u]
为一共多少条边占用当前可能性)
while i<>nil do
begin
y:=i^.ends;
f[y]:=k;
s:=s+i^.date*k;
inc(t);
tm[t]:=y;
i:=i^.next;
end;
until h=t;
end;

begin
readln(n,m);
for i:=1 to m do
begin
readln(x,y,z);
inc(d[x]); //记录他的出度,x有多少条边,它连接的边走的可能性就占百分之几
com(x,y,z);
end;
f[1]:=1; //第一条路的可能性为1
bfs(1);
writeln(s:0:2);
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值