在幻想乡,铃仙•优昙华院•稻叶是从月球逃到永远亭的月兔。同样居住在永远亭的地球兔子因幡帝老是对铃仙恶作剧。某一天,铃仙终于决定要惩罚一下帝,不过首先得在迷途竹林里把帝抓住。永远亭的迷途竹林可以视为一个由N个路口(编号1..N),M条单向路连接的区域。开始时,帝在路口1,每一个单位时间,帝会以相同的概率走到相邻的路口或是停留在当前路口,一条路可以重复走,但是帝不会走回头路,也就是说如果帝从路口x走到了路口y,在到过其他路口前,她一定不会从路口y走回路口x。现在铃仙想知道,在T秒钟以后,在哪个路口抓到帝的可能性最大。
我的数学真的垃圾(可见初中数学联赛之水)
这是正推的期望,因为你要考虑回头路,于是你得上一维推下一维。(于是不会期望的我就死绝在这里了)
然后就是水题了。
f(i,j,k)又i->j当前时间为k的概率
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,m,T;
int g[101][101]={};
double dp[101][101][510]={};
int cd[101]={};
int main(){
int n,m,T;
scanf("%d%d%d",&n,&m,&T);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
g[u][v]=1;
cd[u]++;
}
// for(int i=1;i<=n;i++){
// dp[i][1][0]=(1.0/(double)n);
// }
dp[0][1][0]=1;
for(int i=1;i<=T;i++){
for(int k=1;k<=n;k++){
for(int j=0;j<=n;j++){
double now=0.0;
double div=cd[k]+1;
if(g[k][j]==1)
div--;
if(div)
now=dp[j][k][i-1]/(double)div;
dp[j][k][i]+=now;
for(int ii=1;ii<=n;ii++){
if(ii!=j&&g[k][ii]==1){
dp[k][ii][i]+=now;
}
}
// cout<<j<<" "<<k<<" "<<now<<endl;
}
}
// for(int j=1;j<=n;j++){
// double now=0;
// for(int k=0;k<=n;k++){
// now+=dp[k][j][i];
// }
// now*=100;
// printf("%.3lf%\n",now);
// }
// printf("------------qaq\n");
}
for(int i=1;i<=n;i++){
double now=0;
for(int j=0;j<=n;j++){
now+=dp[j][i][T];
}
now*=100;
printf("%.3lf\n",now);
}
}