Walk
Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1083 Accepted Submission(s): 694
Special Judge
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.
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.
Your answer will be accepted if its absolute error doesn't exceed 1e-5.
5 10 100
1 2
2 3
3 4
4 5
1 5
2 4
3 5
2 5
1 4
1 3
10 10 10
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
9 10
4 9
0.0000000000
0.0000000000
0.0000000000
0.0000000000
0.6993317967
0.5864284952
0.4440860821
0.2275896991
0.4294074591
0.4851048742
0.4896018842
0.4525044250
0.3406567483
0.6421630037
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>
#include <vector>
using namespace std;
const int INF = ;
int n,m,d;
vector <int> edge[];
double dp[][]; ///dp[i][j] 代表不经过某点第 j 步到达第 i 点的概率,枚举每个点 double solve(int x){
for(int i=;i<=n;i++) dp[i][] = 1.0/n;
for(int i=;i<=d;i++){
for(int j=;j<=n;j++){
if(j==x) continue;
for(int k=;k<edge[j].size();k++){
int v = edge[j][k];
if(v==x) continue;
dp[j][i]+= dp[v][i-]*1.0/edge[j].size();
}
}
}
double ans = ;
for(int i=;i<=n;i++){
if(i!=x) ans= ans+dp[i][d];
}
return ans;
}
int main(){
int tcase;
scanf("%d",&tcase);
while(tcase--){
scanf("%d%d%d",&n,&m,&d);
for(int i=;i<=n;i++) edge[i].clear();
for(int i=;i<=m;i++) {
int u,v;
scanf("%d%d",&u,&v);
if(u==v) continue;
edge[u].push_back(v);
edge[v].push_back(u);
}
for(int i=;i<=n;i++){
memset(dp,,sizeof(dp));
printf("%.10lf\n",solve(i));
}
}
return ;
}