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
 
 

 
 
题意:n个点,m条边的无向图,你随机的从一个点开始,走k步,问你对于每一个点,它不被经过的概率是多少。
我们这样考虑,一个点不被经过的概率就是1-这个点经过的概率,所以就设f[i][j]为已经走了i步, 不经过x点,走到第j个点的概率。
$\large f[i+1][to]+=\frac{1}{deg[j]}f[i][j]$
于是对于每一个点我们都跑一遍dp。
然后每个点x的答案就是1-∑dp[i][x].
然后 就水过去了
 
 

 
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define gc getchar()
inline int read(){
int res=;char ch=gc;
while(!isdigit(ch))ch=gc;
while(isdigit(ch)){res=(res<<)+(res<<)+(ch^);ch=gc;}
return res;
}
#undef gc int T, n, m, K;
struct edge{
int nxt, to;
}ed[];
int head[], cnt;
inline void add(int x, int y)
{
ed[++cnt] = (edge){head[x], y};
head[x] = cnt;
}
int deg[];
double f[][]; inline double DP(int cur)
{
memset(f, , sizeof f);
double res = ;
for (int i = ; i <= n ; i ++) f[][i] = (double)(1.0/(double)n);
for (int j = ; j <= K ; j ++)
{
for (int x = ; x <= n ; x ++)
{
if (x == cur) continue;
for (int i = head[x] ; i ; i = ed[i].nxt)
{
int to = ed[i].to;
f[j+][to] += (double)(f[j][x] / (double)deg[x]);
}
}
res += f[j][cur];
}
return res;
} int main()
{
T = read();
while(T--)
{
memset(head, , sizeof head);
memset(deg, , sizeof deg);
cnt = ;
n = read(), m = read(), K = read();
for (int i = ; i <= m ; i ++)
{
int x = read(), y = read();
add(x, y), add(y, x);
deg[x]++, deg[y]++;
}
for (int i = ; i <= n ; i ++)
printf("%.10lf\n", - DP(i));
}
return ;
}

最新文章

  1. 《HTTP权威指南》大块儿头
  2. python 聊天室
  3. opencv 处女作
  4. Accessorizer的使用说明!
  5. Oracle GoldenGate Veridata 12.1.3已经发布
  6. Intellij IDEA 的使用(创建项目、导入项目、同时部署多个项目、JRebel)等常见eclipse、myeclipse换idea必看
  7. Android-ImageView.ScaleType
  8. 【转载】React入门-Todolist制作学习
  9. Java [leetcode 6] ZigZag Conversion
  10. MorningSale 使用帮助
  11. python(3)-内置函数
  12. 动态绑定GridView数据源遇到问题
  13. cat监控平台环境搭建
  14. ylb:SQLServer常用系统函数-字符串函数、配置函数、系统统计函数
  15. .NET MongoDB Driver 2.2 API注释
  16. MySQL数据库学习三 数据库对象和基本操作
  17. Codeforces Round #547 (Div. 3)
  18. js获取时间戳的三种方法
  19. Testing - 软件测试知识梳理 - 基础概念
  20. SQL Server聚合函数与聚合开窗函数 (转载)

热门文章

  1. Mysql高手系列 - 第11篇:深入了解连接查询及原理
  2. Android Studio 3.1.3填坑之路
  3. Linux 笔记 - 第十章 Shell 基础知识
  4. nfs 存储服务
  5. [Leetcode] 第331题 验证二叉树的前序序列化
  6. 【linux】查看系统内存占用
  7. vs加调试代码的正确姿势
  8. Java线程池基础
  9. linux环境下Nginx的安装
  10. 链表-LinkList