每次去掉不包括的那个点,求到其他点的概率即可。用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;
}