TYVJP1933 绿豆蛙的归宿

 

背景

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

描述

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

输入格式

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

输出格式

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

测试样例1

输入

4 4 
1 2 1 
1 3 2 
2 3 3 
3 4 4

输出

7.00

备注

对于20%的数据   N<=100
对于40%的数据   N<=1000
对于60%的数据   N<=10000
对于100%的数据  N<=100000,M<=2*N
 
 
拓扑+动规
测试数据本地均测试无误,但提交的时候全输出0,目测是不知道为什么数据没读进去。诡异,暂未解决。
 
 1 #include<algorithm>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<vector>
 6 #include<queue>
 7 using namespace std;
 8 const int mxn=120000;
 9 vector<int>e[mxn];
10 vector<int>len[mxn];
11 queue<int>q;
12 int out[mxn],deg[mxn]; 
13 double f[mxn];
14 int n,m;
15 
16 int main(){
17     cin>>n>>m;
18     int i,j;
19     int a,b,c;
20     for(i=1;i<=m;i++){
21         scanf("%d %d %d",&a,&b,&c);
22         e[b].push_back(a);//入边 
23         len[b].push_back(c);//边长 
24         out[a]++;
25     }
26     for(i=1;i<=n;i++)deg[i]=out[i];//备份 
27     q.push(n);
28     while(!q.empty()){
29         int v=q.front(),u,le;
30         q.pop();
31         for(i=0;i<e[v].size();i++){
32             u=e[v][i];le=len[v][i];
33             f[u]+=(f[v]+le)/out[u];
34             deg[u]--;
35             if(!deg[u]) q.push(u);
36         }
37     }
38     printf("%.2lf",f[1]);
39     return 0;
40 }

 

 

posted @ 2016-07-01 22:10  SilverNebula  阅读(277)  评论(0编辑  收藏  举报
AmazingCounters.com