题目:
错误思想:所有可能的路径长度求出来求平均。
分析:题解写的太烂了,自己根据dp定义想出来了。
仅仅看我画出来的数学期望。
E(y)+w为从x到y所走的数学期望,具体直接公式性质推到似乎没有,但是从定义很容易想通。
所以,就有了这个公式:
其中x是确定的一点,而y表示x可直接到达的,edge表示两者之间的距离。
逆向如何构造图也是一个难点啊:仔细想了想,遇到有 没有算出来的直接跳过,因为之后一定是可以算到的。
太菜了,暂时写不出来,拖延到图那块在开始吧!
上面咋说那么多废话呢?
再次看这个题的时候,好简答哦!
就是倒着算一波就ok啦。
或者正着用递归也行啊。
反向建边。是完全没必要的。
递归太慢了?
#include<bits/stdc++.h>
using namespace std;
int m,n;//点数 边数
vector<vector<int> > vv1; //点
vector<vector<int> > vv2; //对应边的长度
double e[100005];
double f(int x)
{
if(e[x]!=-1.0) return e[x];
int len=vv1[x].size();
e[x]=0;
for(int i=0;i<len;i++)
{
e[x]+=vv2[x][i]+f(vv1[x][i]);
}
if(len!=0)
e[x]=e[x]/len;
return e[x];
}
int main()
{
cin>>m>>n;
vector<int> v;
for(int i=0;i<=m;i++) vv1.push_back(v);
for(int i=0;i<=m;i++) vv2.push_back(v);
for(int i=0;i<n;i++)
{
int a,b,c;
cin>>a>>b>>c;
vv1[a].push_back(b);
vv2[a].push_back(c);
}
for(int i=0;i<=m;i++) e[i]=-1.0;
f(1);
cout<<e[1];
}