您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: