題目: LINK
一共n個點,一個人從每個點出發的概率是1/n,到達鄰接點的概率相同,求走d步都不會到達ai點的概率i = [1,n]
暴力枚舉每一個點ai, 求的是d步內都不會經過ai,dp[i][j] , 表示走第i步,走到j的概率的值,爲了體現不經過ai點,進行dp過程時,不用和ai點相連的邊進行狀態轉移。
ans = sum(dp[d][j]) ( j != ai)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <queue>
#include <map>
#include <set>
using namespace std;
#define INF 1000000000
//typedef __int64 LL;
#define N 10005
int t, n, d, m;
double dp[N][52];
vector<int > save[55];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif // ONLINE_JUDGE
scanf("%d", &t);
while(t--) {
scanf("%d%d%d", &n, &m, &d);
for(int i = 0; i <= n; i++) save[i].clear();
int u, v;
for(int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
save[u].push_back(v);
save[v].push_back(u);
}
for(int i = 1; i <= n; i++) {
memset(dp, 0, sizeof(dp));
for(int j = 1; j <= n; j++) dp[0][j] = 1.0 / n;
for(int id = 1; id <= d; id ++) {
for(int j = 1; j <= n; j++) {
if(j == i) continue;
int ddd = save[j].size();
for(int kk = 0; kk < ddd; kk++) {
int k = save[j][kk];
dp[id][k] += 1.0 * dp[id - 1][j] / ddd ;
}
}
}
double ans = 0;
for(int j = 1; j <= n; j++) {
if(j == i) continue;
ans += dp[d][j];
}
printf("%lf\n", ans);
}
}
return 0;
}