题目:
随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿。
给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点。绿豆蛙从起点出发,走向终点。
到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。
现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?
解题思路:
期望这个东西去百度搜
记录出度然后爆搜
源程序:
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100005
using namespace std;
struct node{
int y,z,next;
}a[N<<2];
bool v[N<<2];
int cnt,out[N],vis[N],last[N],n,m;
double f[N];
inline void read(int &f)
{
f=0;int d=1;char c=getchar();
while (!isdigit(c)) {if(c=='-')d=-1;c=getchar();}
while (isdigit(c)){f=(f<<3)+(f<<1)+c-48;c=getchar();}
f*=d;return;
}
inline void add(int x,int y,int z)
{a[++cnt].y=y;a[cnt].z=z;a[cnt].next=last[x];last[x]=cnt;}
void dfs(int x)
{
if (v[x]) return;
v[x]=1;
for (int i=last[x];i;i=a[i].next)
{
dfs(a[i].y);
f[x]+=f[a[i].y]+a[i].z;
}
if (out[x])
f[x]/=out[x];
}
int main()
{
read(n);read(m);
for (int i=1;i<=m;i++)
{
int a,b,c;
read(a);read(b);read(c);
add(a,b,c);
out[a]++;
}
dfs(1);
printf("%.2lf",f[1]);
}