随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。
给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度。绿豆蛙从起点出发,走向终点。
到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。
现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?
标签:
随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。
给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度。绿豆蛙从起点出发,走向终点。
到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。
现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?
第一行: 两个整数 N M,代表图中有N个点、M条边
第二行到第 1+M 行: 每行3个整数 a b c,代表从a到b有一条长度为c的有向边
从起点到终点路径总长度的期望值,四舍五入保留两位小数。
对于100%的数据 N<=100000,M<=2*N
题解:水题我爱刷!
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cmath> #define ll long long #define N 100005 #define M 200005 using namespace std; int d[N]; int pre[M],now[N],v[M],val[M]; double f[N]; bool vis[N]; int n,m,tot; int read() { int x=0,f=1; char ch; while (ch=getchar(),ch<‘0‘||ch>‘9‘) if (ch==‘-‘) f=-1; while (x=x*10+ch-‘0‘,ch=getchar(),ch>=‘0‘&&ch<=‘9‘); return x*f; } void ins(int a,int b,int c) { ++tot; pre[tot]=now[a]; now[a]=tot; v[tot]=b; val[tot]=c; } void solve(int x,int fa) { if (!vis[x]) vis[x]=1; else return ; for (int p=now[x]; p; p=pre[p]) { int son=v[p]; if (son==fa) continue; solve(son,x); f[x]+=val[p]+f[son]; } if (d[x]) f[x]=1.0*f[x]/d[x]; } int main() { n=read(); m=read(); for (int i=1; i<=m; i++) { int u=read(),v=read(),val=read(); ins(u,v,val); d[u]++; } solve(1,0); printf("%0.2lf",f[1]); }
标签:
原文地址:http://www.cnblogs.com/HQHQ/p/5793812.html