Description

奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡。猪猡的文明包含1到N一共N个猪城。这些城市由M条由两个不同端点AjA_j和BjB_j (1≤Aj≤N;1≤Bj≤N)(1 \le A_j \le N; 1 \le B_j \le N) 表示的双向道路连接。保证城市1至少连接一个其它的城市。一开始臭气弹会被放在城市1。每个小时(包括第一个小时),它有P/Q (1≤P≤1,000,000,1≤Q≤1,000,000)(1 \le P \le 1,000,000 , 1 \le Q \le 1,000,000) 的概率污染它所在的城市。如果这个小时内它没有污染它所在的城市,那麽它随机地选择一条道路,在这个小时内沿着这条道路走到一个新的城市。可以离开这个城市的所有道路被选择的概率均等。因为这个臭气弹的随机的性质,奶牛们很困惑哪个城市最有可能被污染。给定一个猪猡文明的地图和臭气弹在每个小时内爆炸的概率。计算每个城市最终被污染的概率。如下例,假设这个猪猡文明有两个连接在一起的城市。臭气炸弹从城市1出发,每到一个城市,它都有1/2的概率爆炸。 1–2 可知下面这些路径是炸弹可能经过的路径(最后一个城市是臭气弹爆炸的城市):
1: 1
2: 1-2
3: 1-2-1
4: 1-2-1-2
5: 1-2-1-2-1 …
要得到炸弹在城市1终止的概率,我们可以把上面的第1,第3,第5……条路径的概率加起来,(也就是上表奇数编号的路径)。上表中第k条路径的概率正好是(1/2)k(1/2)^k,也就是必须在前k-1个回合离开所在城市(每次的概率为1 - 1/2 = 1/2)并且留在最后一个城市(概率为1/2)。所以在城市1结束的概率可以表示为1/2+(1/2)3+(1/2)5+…1/2 + (1/2)^3 + (1/2)^5 + \dots 当我们无限地计算把这些项一个个加起来,我们最后会恰好得到2/3,也就是我们要求的概率,大约是0.666666667。这意味着最终停留在城市2的概率为1/3,大约为0.333333333。

Input

  • 第1行: 四个由空格隔开的整数: N, M, P, 和 Q
  • 第2到第M+1行: 第i+1行用两个由空格隔开的整数AjA_j和BjB_j表示一条道路。

Output

  • 第1到第N行: 在第i行,用一个浮点数输出城市i被摧毁的概率。误差不超过10−610^{-6}的答桉会 被接受(注意这就是说你需要至少输出6位有效数字使得答桉有效)。

Sample Input

2 1 1 2
1 2

Sample Output

0.666666667
0.333333333

Hint

2≤N≤3002 \le N \le 300
1≤M≤44,8501 \le M \le 44,850

Solution

我们构造一个n*n的转移矩阵E[ ][ ],其中E[i][j]表示i→ji\rightarrow j转移的概率,易得E[i][j]=(1−P/Q)deg[i]E[i][j]=\frac{(1-P/Q)}{deg[i]}
然后我们构造一个1*n的单位向量T[],表示当前走到每个点的概率,初始时T[0]=1,0,0,…,0T[0]={1,0,0,\dots,0} , T[i]=T[i−1]∗ET[i]=T[i-1]*E
设答案数组为ans,则有ans=∑i≥0P/Q∗T[i]=P/Q∗T∗(E0+E1+E2+…)ans=\sum_{i\ge 0}P/Q*T[i]=P/Q*T*(E^0+E^1+E^2+\dots)
根据无穷递降等比数列求和公式,ans=P/Q∗T∗I/(I−E)ans=P/Q*T*I/(I-E) [I为单位矩阵]
然后我们可以展开然后列出n个方程,利用高斯消元求解即可!

Code

#include<bits/stdc++.h>
#define maxn 501
#define maxm 50010
#define eps 1e-7
// #define DEBUG
using namespace std;
int n,m,p,q;
double rate;
int edge[maxn][maxn];
double a[maxn][maxn];inline int dcmp(double x)
{if(abs(x)<=eps) return 0;else return x>0?1:-1;
}inline int read()
{char ch;int read=0,sign=1;doch=getchar();while((ch<'0'||ch>'9')&&ch!='-');if(ch=='-') ch=getchar(),sign=-1;while(ch>='0'&&ch<='9'){read=read*10+ch-'0';ch=getchar();}return sign*read;
}void change()
{for(int i=1;i<=n;++i)for(int j=1;j<=n;++j){if(edge[i][j]) a[j][i]=(rate-1)/edge[i][0];if(i==j) a[i][j]+=1;}a[1][n+1]=rate;
}void prework()
{n=read(),m=read(),p=read(),q=read();rate=double(p)/double(q);for(int i=1,u,v;i<=m;++i){int u=read();int v=read();edge[u][v]=1;edge[v][u]=1;edge[u][0]++;edge[v][0]++;}change();
#ifdef DEBUGfor(int i=1;i<=n;++i){for(int j=1;j<=n+1;++j)printf("%.3lf ",a[i][j]);printf("\n");}
#endif
}void gauss()
{for(int i=1;i<=n;++i){if(!dcmp(a[i][i])){int k=i;while(!dcmp(a[k][k])) k++;swap(a[k],a[i]);}for(int j=i+1;j<=n;++j){for(int k=i+1;k<=n+1;++k)a[j][k]-=a[i][k]*(a[j][i]/a[i][i]);a[j][i]=0;}}for(int i=n;i>1;--i){a[i][n+1]/=a[i][i];for(int j=1;j<i;++j){a[j][n+1]-=a[i][n+1]*a[j][i];a[j][i]=0;}}for(int i=1;i<=n;++i) printf("%.9lf\n",a[i][n+1]);
}int main()
{prework();gauss();return 0;
}

bzoj1778 驱逐猪猡 [高斯消元+概率DP]相关推荐

  1. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]

    1778: [Usaco2010 Hol]Dotp 驱逐猪猡 题意:一个炸弹从1出发p/q的概率爆炸,否则等概率走向相邻的点.求在每个点爆炸的概率 高斯消元求不爆炸到达每个点的概率,然后在一个点爆炸就 ...

  2. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元+期望dp)

    传送门 解题思路 设\(f(x)\)表示到\(x\)这个点的期望次数,那么转移方程为\(f(x)=\sum\frac{f(u)*(1 - \frac{p}{q})}{deg(u)}\),其中\(u\) ...

  3. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 (高斯消元)

    题面 题目传送门 分析 令爆炸概率为PPP.设 f(i)=∑k=0∞pk(i)\large f(i)=\sum_{k=0}^{\infty}p_k(i)f(i)=∑k=0∞​pk​(i),pk(i)p ...

  4. CF113D 高斯消元、dp

    题目链接 https://codeforces.com/contest/113/problem/D 思路 \(k[i]=\frac{1-p[i]}{ru[i]}\) f[i][j]表示经过i和j的次数 ...

  5. bzoj4820 [Sdoi2017]硬币游戏 高斯消元+概率+kmp

    有环的概率是可以高斯消元的 由于匹配情况可能从一个串转移到另一个串,所以需要建一个转移关系的图 就可以建一个ac自动机,但节点数是nm的.就可以设未知数,然后凑一些方程. 设N表示没有任何人获胜的概率 ...

  6. [高斯消元 概率 KMP] BZOJ 4820 [Sdoi2017]硬币游戏

    一个直观的想法 是建AC自动机 然后消元 但是这样变量个数是O(nm)O(nm) 然后我就不会做了 概率题都好妙啊 一个精妙的设计是再定义一个状态N 表示当前串不包含任何人的概率 举个例子 来自这里 ...

  7. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  8. bzoj1778: [Usaco2010 Hol]Dotp 驱逐猪猡(概率DP+高斯消元)

    深夜肝题...有害身心健康QAQ 设f[i]为到达i的概率,d[i]为i的度数. 因为无限久之后炸弹爆炸的概率是1,所以最后在i点爆炸的概率实际上就是f[i]/sigma(f[]) 列出方程组 f[i ...

  9. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元

    [BZOJ1778][Usaco2010 Hol]Dotp 驱逐猪猡 Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300 ...

最新文章

  1. 系统设计说明书案例_案例 | 太阳能+热泵枸杞烘干系统设计及经济性分析
  2. stream流把list转为map
  3. 雅加达poi_雅加达EE:干净的板岩
  4. php进程间通信 yoc_swoole的process模块创建和使用子进程
  5. 跨域问题是怎样造成的
  6. linux r后台执行,screen 命令简单用法 Linux后台执行 就用它
  7. Linux下C语言编程入门-8关于计时器
  8. 尚硅谷 硅谷新闻_如果每个人都遥不可及,硅谷会损失什么
  9. 百度云网盘高速通道加速破解版 去广告纯净版干净云
  10. 2019年中国软杯-基于深度学习的银行卡号识别系统
  11. 安装搭建Reviewboard 实现pre-commit-review
  12. 【语音增强论文解读 03】TCNN: TEMPORAL CONVOLUTIONAL NEURAL NETWORK FOR REAL-TIME SPEECHENHANCEMENT IN THE TIME
  13. 树莓派外接显示器黑屏_树莓派4B连接显示器黑屏或者提示input not supported
  14. 9月20日科技联播:美团今日上市估值超小米京东;阿里巴巴获杭州第一张自动驾驶牌照...
  15. Linux中安装IE和Office等软件(转)
  16. php中select from,关于php:SELECT * FROM MySQLi
  17. YAML第一章 基本概念及语法
  18. 208核、6TB内存!阿里云发布全球最强云服务器:挑战摩尔定律极限
  19. java hanoi塔问题_Hanoi塔问题 - 智障的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. 运行proto文件踩坑历程

热门文章

  1. CV之IA:利用人工智能算法实现图像动画(以让古代皇帝画像以及古代四大美女画像动起来-来模仿偶像胡歌剧中角色表情动作为例-照片嗨起来)案例应用
  2. PWM调光线性恒流LED恒流芯片X10S
  3. autocad不能画图_记住这10个cad画图技巧,轻松精通cad
  4. Spring Boot概述与入门特点配置方式注入方式yim配置文件与多文件配置Spring Boot自动配置原理lombok应用
  5. python虎扑社区论坛数据爬虫分析报告
  6. msi笔记本u盘装linux,微星msi电脑重装系统_微星笔记本一键U盘重装系统教程图解...
  7. MIMO-OFDM系统原理及其关键技术
  8. Java即时编译器原理解析及实践
  9. 逆向工程核心原理 小结
  10. 【论文阅读】SCRDet++