标签:dp
给你n个点 每条边 最初你在n个点是等概率的 问在k步后 每个点不经过的概率 之前dp直接算到达的概率然后用1去减 结果测试数据都没过,想了想也是 里面有算重复的,
dp【i】【j】 表示第i步到达j点的概率 然后枚举起点 dp都要清空并初始化(这就是为什么直接不能做了) 对于每个起点 不能到达它也就是到达了别的点 这样就好算了
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; double dp[10010][55]; int leap[55],map[55][55],n,k; int deal(int star) { int i,j; for(i=1;i<=k;i++) { for(j=1;j<=n;j++) { if(j==star) continue; for(int x=1;x<=n;x++) { if(x==j) continue; if(map[j][x]==1) { dp[i][x]+=dp[i-1][j]/leap[j]; } } } } double t=0; for(i=1;i<=n;i++) if(i!=star) t+=dp[k][i]; printf("%.10lf\n",t); } int main() { int m,i,j,star,end,T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); memset(map,-1,sizeof(map)); memset(leap,0,sizeof(leap)); for(i=1;i<=m;i++) { int star,end; scanf("%d%d",&star,&end); map[star][end]=map[end][star]=1; leap[star]++; leap[end]++; } for(i=1;i<=n;i++) { memset(dp,0,sizeof(dp)); for(j=1;j<=n;j++) dp[0][j]=1.0/n; deal(i); } } return 0; }
标签:dp
原文地址:http://blog.csdn.net/zxf654073270/article/details/44756125