hdu 5001
每次去掉不包括的那个点,求到其他点的概率即可。用dp[d][n]表示第d步走到n的概率
#include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #include <iomanip> #include <cstdlib> #include <string> #include <memory.h> #include <vector> #include <queue> #include <stack> #include <map> #include <set> #include <ctype.h> #define INF 1000000000000000010LL typedef long long ll; using namespace std; vector<int> q[55]; int num[55]; double dp[10010][55]; int main() { int t; scanf("%d",&t); while(t--) { memset(q,0,sizeof(q)); memset(num,0,sizeof(num)); int n,m,d; cin>>n>>m>>d; for(int i=1; i<=m; i++) { int u,v; scanf("%d%d",&u,&v); q[u].push_back(v); q[v].push_back(u); num[u]++; num[v]++; } for(int i=1; i<=n; i++) dp[0][i]=(1.0/n); for(int sta = 1; sta <= n; sta++) { for(int i=1; i<=d; i++) { for(int j=0; j<=n; j++)dp[i][j]=0.0; } for(int i = 1; i <= d; i++) { for(int j = 1; j <= n; j++) { if(j == sta) continue; for(int k = 0; k < num[j]; k++) { if(q[j][k] == sta) continue; dp[i][q[j][k]] += dp[i-1][j]/num[j]; } } } double ans=0; for(int i=1; i<=n; i++) { ans+=dp[d][i]; } printf("%.10lf\n",ans); } } return 0; }