(DP) hdu 5001

Walk

Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 652    Accepted Submission(s): 403
Special Judge

Problem Description

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.

Input

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.

Output

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.

Sample Input

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

Sample Output

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

Source

2014 ACM/ICPC Asia Regional Anshan Online

简单DP

考虑到 到不了某点的概率就是到达其他点的概率和。每次都去掉一个点求出到达 其他点的概率就是不能到达这个点的概率。

dp[i][j] 表示 到达i位置用了j步

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> e[1010];
int tt,n,m,d;
double dp[60][10010];
int main()
{
      scanf("%d",&tt);
      while(tt--)
      {
            scanf("%d%d%d",&n,&m,&d);
            for(int i=0;i<=n;i++)
                  e[i].clear();
            for(int i=0;i<m;i++)
            {
                  int x,y;
                  scanf("%d%d",&x,&y);
                  e[x].push_back(y);
                  e[y].push_back(x);
            }
            for(int p=1;p<=n;p++)
            {
                  memset(dp,0,sizeof(dp));
                  for(int i=1;i<=n;i++)
                        dp[i][0]=1.0/n;
                  for(int j=0;j<d;j++)
                  {
                        for(int i=1;i<=n;i++)
                        {
                              if(i==p)
                                    continue;
                              int N=e[i].size();
                              for(int k=0;k<N;k++)
                              {
                                    dp[e[i][k]][j+1]+=dp[i][j]*(1.0)/N;
                              }
                        }
                  }
                  double ans=0;
                  for(int i=1;i<=n;i++)
                  {
                        if(i==p)
                              continue;
                        ans+=dp[i][d];
                  }
                  printf("%.9lf\n",ans);
            }
      }
      return 0;
}

  

时间: 2024-10-29 05:11:44

(DP) hdu 5001的相关文章

[概率dp] hdu 5001 Walk

题意:n个点(1~n),m条边,走k次,双向边,每次随机走一条路,起点也随机,问不走到各个点的概率是多少. 思路: 概率dp[i][j][k] 前i步 走到j 走不到k的概率. 那么状态转移就是 j能走到的点,传递所有dp[i][j][k]的值乘上概率. 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"

HDU 5001 Walk(鞍山网络赛E题)

HDU 5001 Walk 题目链接 思路:枚举每个要经过的点,然后进行状态转移,状态为dp[i][j],状态表示当前在j的点,已经走了i步,每次转移的时候,不从这个枚举的点出发,这样就可以求出所有路径经过该点的概率p, 然后1 - p就是不经过的答案 代码: #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; con

简单的dp hdu 数塔(水题)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21314    Accepted Submission(s): 12808 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少

fwt优化+树形DP HDU 5909

1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include <bits/stdc++.h> 6 // #include <iostream> 7 // #include <cstdio> 8 // #include <cstdlib> 9 // #include <algorithm> 10 // #inc

I DP Hdu 1421

<span style="color:#3333ff;">/* ______________________________________________________________________________________________________ author : Grant Yuan time : 2014.7.19 algorithm : dp explain : 首先对所有的物体按照重量的从小到大进行一次排序,第i件物体只能和第i-1件物体配对;

dp --- hdu 4939 : Stupid Tower Defense

Stupid Tower Defense Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1219    Accepted Submission(s): 361 Problem Description FSF is addicted to a stupid tower defense game. The goal of tower

[数位dp] hdu 3967 Zero&#39;s Numberd

题意:对于两个数i和k,把它分为两个部分的数,n和m,如果(n+m)%k=0 那么这算一种分法 比如 333可分成,3.33或者33.3,对于 (333,3)就等于2. 现在给出 a.b.k,为 (a~b,k)有多少种分法 思路:对于一个数,注意前导零并枚举分点就好了. dp[22][22][22][22][2],   代表 i位,分点为fd,余数mod,对于k取余,是否有前导零 代码: #include"cstdlib" #include"cstdio" #inc

Hdu 5001 Walk 概率dp

Walk Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5001 Description 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 bid

hdu 5001 概率DP 图上的DP

http://acm.hdu.edu.cn/showproblem.php?pid=5001 当时一看是图上的就跪了 不敢写,也没退出来DP方程 感觉区域赛的题  一则有一个点难以想到 二则就是编码有点难度. 这个题: 我一直的思路就是1-能到达i的概率 就是不能到达i的概率,然后三维方程巴拉巴拉,,,,把自己搞迷糊 正确做法: dp[k][j]   经过j步到达k点 并且不经过i点的概率 这么设的原因是,就可以求不能到达i点的概率了.   不能到达i点的概率就是segma(dp[v][j-1]