求期望,倒着推比较容易算,避免了求最后一步到达地超过n时期望的计算。。。然后注意如果两点之间有传送门的话,期望的一样的。整个过程大概是马尔可夫过程。。。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
#define LL long long
#define CLR(a, b) memset(a, b, sizeof(a))
#define eps 1e-9
using namespace std;
const int N = 111111;
double dp[N], p = 1.0 / 6.0;
int fa[N];
int main()
{
int n, m, i, j, u, v;
while(scanf("%d%d", &n, &m), n + m)
{
CLR(fa, -1);
for(i = 0; i < m; i ++)
{
scanf("%d%d", &u, &v);
fa[u] = v;
}
CLR(dp, 0);
for(i = n - 1; i >= 0; i --)
{
if(fa[i] != -1) dp[i] = dp[fa[i]];
else
{
dp[i] = 1;
for(j = 1; j <= 6; j ++)
{
dp[i] += p * dp[i + j];
}
}
}
printf("%.4lf\n", dp[0]);
}
}