NC51070. 绿豆蛙的归宿
描述
随着新版百度空间的下线,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
C++11(clang++ 3.9) 解法, 执行用时: 94ms, 内存消耗: 11628K, 提交时间: 2020-03-03 11:47:43
#include<bits/stdc++.h> using namespace std; const int size=1e5+5; typedef pair<int,int> pii; int du[size],in[size]; vector<pii> G[size]; queue<int> q; double ans[size]; int main() { int n,m,a,b,c; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); G[b].push_back(pii(a,c)); du[a]++; in[a]++; } q.push(n); while(!q.empty()) { int u=q.front(); q.pop(); for(auto p:G[u]) { int w=p.second,v=p.first; ans[v]+=(ans[u]+w)/(1.0*in[v]); du[v]--; if(!du[v]) q.push(v); } } printf("%.2f",ans[1]); }
C++14(g++5.4) 解法, 执行用时: 75ms, 内存消耗: 11628K, 提交时间: 2019-10-09 14:13:11
#include<bits/stdc++.h> using namespace std; const int size=1e5+5; typedef pair<int,int> pii; int du[size],in[size]; vector<pii> G[size]; queue<int> q; double ans[size]; int main() { int n,m,a,b,c; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); G[b].push_back(pii(a,c)); du[a]++;in[a]++; } q.push(n); while(!q.empty()) { int u=q.front(); q.pop(); for(auto p:G[u]) { int w=p.second,v=p.first; ans[v]+=(ans[u]+w)/(1.0*in[v]); du[v]--; if(!du[v]) q.push(v); } } printf("%.2f",ans[1]); }