Problem descriptioni used to think I cocould be anything, but now I know that I couldn't do anything. So I started traveling.
The nation looks like a connected bidirectional graph, and I am randomly walking on it. it means when I am at node I, I will travel to an adjacent node with the same probability in the next step. I will pick up the Start Node randomly (each node in the graph has the same probability .), and travel for D Steps, noting that I may go through some nodes multiple times.
If I miss some sights at a node, it will make me unhappy. So I wonder for each node, what is the probability that my path doesn' t contain it.
Inputthe first line contains an integer T, denoting the number of the test cases.
For each test case, the first line contains 3 integers n, m and D, denoting the number of vertices, the number of edges and the number of steps respectively. then M lines follows, each containing two integers A and B, denoting there is an edge between node A and Node B.
T <= 20, n <= 50, n-1 <= m <= N * (n-1)/2, 1 <= d <= 10000. there is no self-loops or multiple edges in the graph, and the graph is connected. the nodes are indexed from 1.
Outputfor each test cases, output n lines, the I-th line containing the desired probability for the I-th node.
Your answer will be accepted if its absolute error doesn't exceed 1e-5.
Sample Input
25 10 1001 22 33 44 51 52 43 52 51 41 310 10 101 22 33 44 55 66 77 88 99 104 9
Sample output
An undirected graph with n vertices and m edges: DP [J] [d] indicates the probability to reach a big J point after step d without passing through I.#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int maxn = 55;const double eps = 1e-8;int n, m, d;double dp[maxn][10010];double ans[maxn]; vector<int> map[maxn];int main() {int t, x, y;scanf("%d", &t);while (t--) {scanf("%d%d%d", &n, &m, &d);for (int i = 1; i <= n; i++)map[i].clear();for (int i = 1; i <= m; i++) {scanf("%d%d", &x, &y);map[x].push_back(y);map[y].push_back(x);}for (int k = 1; k <= n; k++) {memset(dp, 0, sizeof(dp));for (int i = 1; i <= n; i++)dp[i][0] = 1.0 / n;for (int i = 0; i < d; i++) {for (int j = 1; j <= n; j++) {if (j == k)continue;int size = map[j].size();for (int l = 0; l < size; l++) {int u = map[j][l];dp[u][i+1] += dp[j][i] * 1.0 / size;}}}ans[k] = 0.0;for (int i = 1; i <= n; i++) if (i != k)ans[k] += dp[i][d];printf("%.10f\n", ans[k]);}}return 0;}
HDU-5001 walk