hdu 5001 Walk 【概率dp】
2016-10-03 15:50
531 查看
Walk
Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1124 Accepted Submission(s): 719
Special Judge
[align=left]Problem Description[/align]
I used to think I could 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.
[align=left]Input[/align]
The 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.
[align=left]Output[/align]
For 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.
[align=left]Sample Input[/align]
2
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
[align=left]Sample Output[/align]
0.0000000000
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
/* 题意:给你一个N个点和M条双向边的图,每条边是一步的距离.任选起点出发,走k步,中间可以经过一个点多次. 问你不经过每个点的概率是多少. 类型:概率DP 分析:dp[i][j]表示在第j步到达i点的概率 */ #include<cstdio> #include<cstring> #include<vector> #include<algorithm> using namespace std; const int maxn = 55; const int maxd = 10005; double dp[maxn][maxd]; int n,m,d; vector <int> G[maxn]; double solve(int u){ double res=0; memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++){ if(i!=u)dp[i][0]=1.0/n; } for(int j=1;j<=d;j++){ for(int i=1;i<=n;i++){ if(i==u)continue; int len=G[i].size(); for(int k=0;k<len;k++){ int v=G[i][k]; dp[v][j]+=dp[i][j-1]*1.0/len; } } res+=dp[u][j]; } return 1-res-1.0/n; } int main() { int t; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&d); int u,v; for(int i=0;i<=n;i++)G[i].clear(); for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } for(int i=1;i<=n;i++){ printf("%.10f\n",solve(i)); } } return 0; }
相关文章推荐
- hdu 5001 Walk 概率DP
- HDU 5001 Walk(概率DP)
- hdu 5001 Walk ( 概率DP )
- HDU 5001 Walk (概率dp)
- 【HDU 5001】Walk(矩阵快速幂+概率DP)
- hdu 5001 Walk (概率dp)
- hdu5001 Walk 概率DP
- HDU 5001-Walk(概率dp)
- HDU 5001 Walk 概率DP
- [ACM] hdu 5001 Walk (概率DP)
- HDU 5001 Walk (概率DP)
- HDU 5001 Walk(暴力+概率DP)
- HDU 5001 Walk 概率DP BFS 矩阵递推 暴力
- HDU 5001 Walk 概率DP入门!
- hdu 5001 walk 概率dp入门题
- HDU-5001 Walk (概率DP)
- HDU - 5001 Walk(概率dp)
- hdu 5001 Walk (概率dp)
- [概率dp] hdu 5001 Walk
- hdu 5001 Walk 概率dp 2014 ACM/ICPC Asia Regional Anshan Online