2014鞍山ACM网络赛 HDU5001 Walk

Walk

Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 543    Accepted Submission(s): 344
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

总结:在做这道题目的时候刚开始自己一直纠结于,如何处理这种情况 A,B,C       当走第二部的时候,有A到B的那部分概率就不能由B走到A了,,这个问题纠结了好长时间,可能是因为自己以前没有做过概率DP方面的东西吧。 看了下别人的题解才知道, 只需要枚举出来一个点在走的时候不把它作为起点就一切OK了,, 这个时候才明白过来, 反正我们算的是枚举的这个点的概率,其它点之间爱咋搞咋搞。

代码,, 一把辛酸泪,,

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<ctime>
 5 #include<cstring>
 6 #include<string>
 7 #include<map>
 8 #include<set>
 9 #include<cmath>
10 #include<stack>
11 #include<queue>
12 #include<vector>
13 #include<algorithm>
14 #define inf 0x3f3f3f3f
15 #define PI acos(-1.0)
16 #define eps 1e-6
17 #define LL long long
18 #define MEM(a,b) memset(a,b,sizeof(a))
19 #define PB push_back
20 #define MP make_pair
21 #define PQ priority_queue
22 #define IN freopen("in.txt","r",stdin);
23 #define OUT freopen("out.txt","w",stdout);
24 #define BUG printf("bug************bug************bug\n");
25
26 using namespace std;
27
28 const int N=60;
29 double f[2][N][N];
30 double p[N];
31 vector <int> G[N];
32
33 int main()
34 {
35     int T,n,m,d,x,y;
36     scanf("%d",&T);
37     while (T--){
38         memset(p,0,sizeof(p));
39         memset(f,0,sizeof(f));
40         scanf("%d%d%d",&n,&m,&d);
41         for (int i=1;i<=n;i++) G[i].clear();
42         for (int i=1;i<=m;i++){
43             scanf("%d%d",&x,&y);
44             G[x].push_back(y);
45             G[y].push_back(x);
46         }
47         for (int i=1;i<=n;i++)
48             for (int j=1;j<=n;j++) f[0][i][j]=1.0/n;
49
50         for (int k=0;k<d;k++){
51             memset(f[(k+1)&1],0,sizeof(f[(k+1)&1]));
52             for (int i=1;i<=n;i++){
53                 for (int j=1;j<=n;j++){
54                     if (i==j) continue;
55                     int u=G[j].size();
56                     for (int v=0;v<u;v++){
57                         int x=G[j][v];
58                         f[(k+1)&1][i][x]+=f[k&1][i][j]/u;
59                     }
60                 }
61                 p[i]+=f[(k+1)&1][i][i];
62             }
63         }
64         for (int i=1;i<=n;i++)
65             printf("%0.10lf\n",1-p[i]-1.0/n);
66     }
67 }
68
69 /*
70 2
71 5 10 2
72 1 2
73 2 3
74 3 4
75 4 5
76 1 5
77 2 4
78 3 5
79 2 5
80 1 4
81 1 3
82 1
83 3 4 4
84 1 2
85 2 3
86 3 1
87 */
时间: 2024-10-18 16:24:27

2014鞍山ACM网络赛 HDU5001 Walk的相关文章

2014辽宁ACM省赛 Prime Factors

问题 L: Prime Factors 时间限制: 1 Sec  内存限制: 128 MB 提交: 36  解决: 28 [提交][状态][论坛] 题目描述 I'll give you a number , please tell me how many different prime factors in this number. 输入 There is multiple test cases , in each test case there is only one line contain

2014辽宁ACM省赛 Distance

问题 E: Distance 时间限制: 1 Sec  内存限制: 128 MB 提交: 48  解决: 12 [提交][状态][论坛] 题目描述 There is a battle field. It is a square with the side length 100 miles, and unfortunately we have two comrades who get hurt still in the battle field. They are in different pos

2014.09.13 网络赛杂感

在参加这场网络赛之前,我还在为暑假刷的一百多道水题而洋洋自得. 直到我开始做题的时候,才回想起那最初支配我的恐惧(借用的进击的巨人的台词,这句有点恶搞了). 十道题,五个小时,我们几个人也就解决了两道题.第二道计算几何的那道题是我们一番讨论才A过去的,虽然我几乎没有做过计算几何这类的题目,公式都是自己先推的. 更虐心的是,出题人是与我同龄的CLJ. 这种被俯视的感觉完全抬不起头来,就如同蝼蚁一般. 今天有点冷,下了一天的雨.我们连比赛的机房都没有,几个人找了个自习室,连上校园网默默的打比赛. 还

HDU5001 Walk (2014年鞍山赛区网络赛E题)

1.题目描述:点击打开链接 2.解题思路:本题利用矩阵快速幂+概率dp解决.根据题意可以画出来一个状态转移图,根据状态转移图不难得到一步转移概率矩阵,接下来的问题是:如何求解d步之内(包括d)均无法从其他点走到结点u的概率. 首先,既然无法到达结点u,那么出发的时候就不能选择该点.其次,为了使其他结点也无法到达结点u,可以将一步转移概率矩阵中跟结点u有关的概率全部置零.即表示u结点出发无法到达其他结点,其他结点也均无法到达u结点,这样就相当于把u结点从状态转移图中暂时删去了.然后根据马氏链的知识

2014 ACM/ICPC 鞍山赛区网络赛(清华命题)

为迎接10月17号清华命题的鞍山现场赛 杭电上的题目 Biconnected(hdu4997)      Rotate(hdu4998)     Overt(hdu4999)   Clone(hdu5000)   Walk(hdu5001)   LianLianKan   Rescue   Spy's Work   Color the Tree   The Ghost Blows Light   USACO ORZ   2013/8/27

HDU 4998 Rotate(计算几何)2014年鞍山赛区网络赛

Rotate                                                                           Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Special Judge Problem Description Noting is more interesting than rotation! Your litt

HDU5006 Resistance (2014年鞍山赛区网络赛J题)

1.题目描述:点击打开链接 2.解题思路:本题利用缩点+高斯消元解决.本题的最大特点就是电阻非零即一,如果电阻为0,说明零点之间是等电位点,可以看做一个整体,自然可以想到先利用并查集进行缩点操作,将复杂的电路图转化为不相等的电位点构成的电路图.如果转换完毕后,发现s和t在一个集合中,说明两点之间是等电位的,等效电阻为0,否则,对转换后的图G'重新判断连通性,依然可以利用并查集解决,如果发现不连通,说明s与t之间开路,电阻为inf,否则,就可以根据tot个点的电位列写方程. 我们令有1A的电流从点

HDU 5002 Tree (2014年鞍山赛区网络赛F题)

1.题目描述:点击打开链接 2.解题思路:LCT的模板题 3.代码: #include <cstdio> #include <cstdlib> #include <algorithm> #include <iostream> #include <vector> using namespace std; const int N = 111111; const int INF = 1111111111; int n, m; class LCT { p

HDU4998 Rotate (2014年鞍山赛区网络赛B题)

1.题目描述:点击打开链接 2.解题思路:本题属于几何变换专题,一开始想着随便枚举两个点,然后都进行一下旋转变换,最后利用原始点和旋转后的点所在直线的中垂线的交点求解.然而发现精度损失很大,而且可能有特殊情况没有考虑到.学习了一下几何变换的方法. 由于旋转操作相当于对一个点构成的矩阵和一个旋转矩阵做乘法运算.最基本的旋转变换就是任意一个点围绕原点进行逆时针旋转.如果改成围绕某个定点(x0,y0)进行旋转可以分解为三步:将被旋转点平移(-x0,-y0),进行基本旋转变换,再平移(x0,y0).在矩