UVa10828 Back to Kernighan-Ritchie——概率转移&&高斯消元法
题意
给出一个程序控制流图,从每个结点出发到每个后继接结点的概率均相等。当执行完一个没有后继的结点后,整个程序终止。程序总是从编号为1的结点开始。你的任务是对于若干个查询结点,求出每个结点的期望执行次数。结点个数 $n < 10$.
分析
如果是有向无环图,可以直接解出递推关系,再采用记忆化搜索求解。
当这题可能有环,只能列出方程,用高斯消元解方程组。
设结点 $i$ 的出度为 $d_I$,期望的执行次数为 $x_i$。对于一个拥有三个前驱结点 $a, b, c$ 的结点 $i$,可以列出方程 $x_i = x_a / d_a + x_b / d_b + x_c / d_c$.
如果 $x_i$为无穷大或0,通过代数方法会出错的,所以我们结合实际意义考虑,
哪些结点期望执行无数次呢?就是那些无法到达终态的结点(即一直在非终态循环);
哪些结点期望执行次数为0次呢?就是那些从起点出发到不了的点。
我们可以先用Floyd求出传递闭包,先找到无穷大点和零点,
如果使用高斯-约当消元法可以避免这一预处理,当 $A[i][i] = A[i][n] = 0$ 时 $x_i=0$,而 $A[i][i] = 0$ 但 $A[i][n] > 0$ 时 $x_i$ 为正无穷大(这个结论看似显然
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std; const double eps = 1e-;
const int maxn = +;
typedef double Matrix[maxn][maxn]; //结果为A[i][n]/A[i][i]
void gauss_jordan(Matrix A, int n)
{
int i, j, k, r;
for(i = ;i < n;i++)
{
//选绝对值一行r并与第i行交换
r = i;
for(j = i+;j < n;j++)
if(fabs(A[j][i]) > fabs(A[r][i])) r = j;
if(fabs(A[r][i]) < eps) continue; //放弃这一行,直接处理下一行
if(r != i) for(j = ;j <= n;j++) swap(A[r][j], A[i][j]); //与除第i行外的其他行进行消元
for(k = ;k < n;k++) if(k != i)
for(j = n;j >= i;j--) A[k][j] -= A[k][i] / A[i][i] * A[i][j];
}
} Matrix A;
int n, d[maxn];
vector<int>pre[maxn];
int inf[maxn]; int main()
{
int kase = ;
while(scanf("%d", &n) == && n)
{
memset(d, , sizeof(d));
for(int i = ;i < n;i++) pre[i].clear(); int a, b;
while(scanf("%d%d", &a, &b) == && a)
{
a--; b--; //编号从0开始
d[a]++; //结点a的出度加1
pre[b].push_back(a);
} //构造方程组
memset(A, , sizeof(A));
for(int i = ;i < n;i++)
{
A[i][i] = ;
for(int j = ;j < pre[i].size();j++)
A[i][pre[i][j]] -= 1.0 / d[pre[i][j]];
if(i == ) A[i][n] = ;
} //解方程组,标记无穷变量
gauss_jordan(A, n);
memset(inf, , sizeof(inf));
for(int i = n-; i >= ;i--)
{
if(fabs(A[i][i]) < eps && fabs(A[i][n]) > eps) inf[i] = ; //直接解出来的无穷变量 for(int j = i+; j < n;j++) //和无穷变量扯上关系的变量也是无穷变量
if(fabs(A[i][j]) > eps && inf[j]) inf[i] = ;
} int q, u;
scanf("%d", &q);
printf("Case #%d:\n", ++kase);
while(q--)
{
scanf("%d", &u);
u--;
if(inf[u]) printf("infinity\n");
else printf("%.3f\n", fabs(A[u][u]) < eps ? 0.0 : A[u][n] / A[u][u]);
}
}
return ;
}
第一次在UVA官网交上题hh,题目链接
From:
《算法竞赛入门经典训练指南》——刘汝佳、陈锋著
UVa10828 Back to Kernighan-Ritchie——概率转移&&高斯消元法的更多相关文章
- 2019湖南省赛H题——概率转移&&逆矩阵
题意 题目链接 Bobo有一个 $n+m$ 个节点的有向图,编号分别为 $1 \sim n$,他还有一个 $n$ 行 $n+m$ 列的矩阵 $P$. 如果在 $t$ 时刻他位于节点 $u(1 \leq ...
- UVA-10828 (概率期望+高斯消元)
题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个 ...
- bzoj 4008 亚瑟王 期望概率dp
对于这种看起来就比较傻逼麻烦的题,最关键的就是想怎么巧妙的设置状态数组,使转移尽可能的简洁. 一开始我想的是f[i][j]表示到第j轮第i张牌还没有被选的概率,后来发现转移起来特别坑爹,还会有重的或漏 ...
- 2018.10.13 bzoj4008: [HNOI2015]亚瑟王(概率dp)
传送门 马上2点考初赛了,心里有点小紧张. 做道概率dp压压惊吧. 话说这题最开始想错了. 最开始的方法是考虑f[i][j]f[i][j]f[i][j]表示第iii轮出牌为jjj的概率. 然后用第ii ...
- luoguP3239 [HNOI2015]亚瑟王 概率期望DP
当初怎么想的来着.....又忘了...... 首先,总期望 = 每张卡片的期望之和 求期望,只要我们求出每张卡片被用掉的概率即可 如果直接上状态$f[i][j]$表示在第$i$轮中,第$j$张牌发动的 ...
- 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp
题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...
- HDU - 1099 - Lottery - 概率dp
http://acm.hdu.edu.cn/showproblem.php?pid=1099 最最简单的概率dp,完全是等概率转移. 设dp[i]为已有i张票,还需要抽几次才能集齐的期望. 那么dp[ ...
- HDU4576 Robot(概率)
题意 抄袭自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 多组输入n,m,l,r.表示在一个环上有n个格子.接下来输入m个w表示连续的一段 ...
- 基于机器学习的web异常检测——基于HMM的状态序列建模,将原始数据转化为状态机表示,然后求解概率判断异常与否
基于机器学习的web异常检测 from: https://jaq.alibaba.com/community/art/show?articleid=746 Web防火墙是信息安全的第一道防线.随着网络 ...
随机推荐
- LeetCode 1259. Handshakes That Don't Cross - Java - DP
题目链接:https://leetcode-cn.com/problems/handshakes-that-dont-cross/ You are given an even number of pe ...
- jupyter notebook在 mac 使用
1. 查看当前 conda 所拥有的环境列表 conda env list 2. 选择要进入的环境 source activate your_env_name 3. 启动 jupyter jupyte ...
- Java单元测试 Http Server Mock框架选型
背景动机 某期优化需要针对通用的HttpClient封装组件--HttpExecutor在保证上层暴露API不动的前提做较多改动,大致包括以下几点: apache http client 版本升级 H ...
- 自学Python编程的第八天----------来自苦逼的转行人
2019-09-18-21:11:24(初学者不会学博客,望大家见谅见谅) 今天学的内容是有关list..dict.set集合的使用方法和注意事项 list和dict在循环中不可删,而且list在迭代 ...
- 原生JavaScript实现轮播图
---恢复内容开始--- 实现原理 通过自定义的animate函数来改变元素的left值让图片呈现左右滚动的效果 HTML: <!DOCTYPE html> <html> &l ...
- JavaScript笔记01_基本操作
目录 1. JS代码编写的位置 2. 为什么JavaScript中代码要以分号结束 3. 字面量和变量 4. 数据类型 5. 类型装换 6. ++a和a++ 7. 逻辑运算符 8. 相等运算符 9. ...
- 【CMDB】API传输验证
客户端向服务器发送请求时,在请求头添加自定义的字符串 客户端的加密方式 1.对key+time进行md5加密 2.发送的时候的格式为md5_key|time,将时间也发送过去 服务器端验证 1.获取加 ...
- ss-套接字监控工具
ss(Socket Statistics) - another utility to investigate sockets(研究套接字的另一个实用程序,原先的是netstat) ss用于转储套接字统 ...
- 日志聚合工具loki
目录 1.loki是什么 2.loki特点 3.loki组成 4.loki安装 4.1.添加helm的chart库 4.2.安装loki及promtail 4.3.安装grafana 5.配置和使用 ...
- System.Runtime.Caching中MemoryCache帮助类
值得参考的几个内存缓存帮助类: 参考资料: https://github.com/Hendy/memory-cache-helper https://gist.github.com/jdalley/0 ...