题意:给定一个有向连通图,求1到N的期望距离
分析:
一道数学期望裸题。对于每一个结点来说其期望值p[i]=tmp*Σ(p[i->son]+dist[i->son]),其中tmp为每条路径概率,即为出度的倒数。
注意vst数组,两条路径均可到一个结点时,搜索一遍即可。
用bfs写也可以
代码如下:
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100010;
struct edge{int val,to,next;}e[maxn<<1];
int n,m,cnt;
double ans;
int head[maxn],in[maxn],out[maxn];
double p[maxn];
bool vst[maxn];
void insert(int a,int b,int val)
{
e[++cnt].to=b;e[cnt].val=val;e[cnt].next=head[a];head[a]=cnt;out[a]++;
}
void dfs(int x)
{
if(vst[x])return;
vst[x]=true;
for(int i=head[x];i;i=e[i].next)
{
dfs(e[i].to);
p[x]+=p[e[i].to]+e[i].val;
}
if(out[x])p[x]/=(1.0*out[x]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b,val;
scanf("%d%d%d",&a,&b,&val);
insert(a,b,val);
}
dfs(1);
printf("%.2lf",p[1]);
}