AC代码如下:
以dp[mv][i][j]表示走mv步时不经过点i到达j的概率。。。
# include<cstdio>
# include<cstring>
# include<iostream>
# include<algorithm>
# include<vector>
# include<queue>
# include<stack>
# include<string>
# include<cctype>
# include<map>
# define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
double dp[2][55][55];
int n,m,d;
int in[55];
vector<int> G[55];
int main()
{
int test;
scanf("%d",&test);
while(test--)
{
memset(in,0,sizeof(in));
scanf("%d%d%d",&n,&m,&d);
for(int i=1;i<=n;i++) G[i].clear();
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
in[u]++;
in[v]++;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j) dp[0][i][j]=0;
else dp[0][i][j]=1.0/n;
}
}
for(int mv=1;mv<=d;mv++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) dp[mv%2][i][j]=0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) if(i!=j)
{
for(int k=0;k<G[j].size();k++)
{
int v=G[j][k];
if(v==i) continue;
dp[mv%2][i][v]+=dp[(mv%2)^1][i][j]/in[j];
}
}
}
}
for(int i=1;i<=n;i++)
{
double res=0;
for(int j=1;j<=n;j++)
{
res+=dp[d%2][i][j];
}
printf("%.10lf\n",res);
}
}
return 0;
}