bzoj1778 [Usaco2010 Hol]Dotp 驱逐猪猡
来源:互联网 发布:手机禁网软件 编辑:程序博客网 时间:2024/05/19 17:27
Description
奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡。猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城。这些城市由M (1 <= M <= 44,850)条由两个不同端点A_j和B_j (1 <= A_j<= N; 1 <= B_j <= N)表示的双向道路连接。保证城市1至少连接一个其它的城市。一开始臭气弹会被放在城市1。每个小时(包括第一个小时),它有P/Q (1 <= P <=1,000,000; 1 <= Q <= 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,也就是必须在前k-1个回合离开所在城市(每次的概率为1 - 1/2 = 1/2)并且留在最后一个城市(概率为1/2)。所以在城市1结束的概率可以表示为1/2 + (1/2)^3 + (1/2)^5 + …。当我们无限地计算把这些项一个个加起来,我们最后会恰好得到2/3,也就是我们要求的概率,大约是0.666666667。这意味着最终停留在城市2的概率为1/3,大约为0.333333333。
Input
第1行: 四个由空格隔开的整数: N, M, P, 和 Q * 第2到第M+1行: 第i+1行用两个由空格隔开的整数A_j和B_j表示一条道路。
Output第1到第N行: 在第i行,用一个浮点数输出城市i被摧毁的概率。误差不超过10^-6的答桉会 被接受(注意这就是说你需要至少输出6位有效数字使得答桉有效)。
Sample Input
2 1 1 2
1 2
Sample Output
0.666666667
0.333333333
HINT
Source
谁TM能跟我解释一下gold组,还是10年的,出这种题。。防AK的吧。
题意就不说了,比较好理解。
具体过程比较复杂,这里引用一下popoqqq大爷的题解。
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define eps 1e-6using namespace std;int n,m,p,q;const int N=1e5+5;typedef double db;int d[N];db rate,f[505][505],ans[N];inline void gauss(){ int k; fo(i,1,n) { k=i; fo(j,i+1,n) if (fabs(f[j][i])>fabs(f[k][i])) k=j; fo(j,i,n+1) swap(f[i][j],f[k][j]); fo(j,i+1,n) { double temp=-f[j][i]/f[i][i]; fo(k,i,n+1) f[j][k]+=f[i][k]*temp; } } fd(i,n,1) { fo(j,i+1,n) { f[i][n+1]-=f[i][j]*ans[j]; } ans[i]=f[i][n+1]/f[i][i]; }}int main(){ scanf("%d%d%d%d",&n,&m,&p,&q); if (p>q)p=q; rate=(double)p/q; fo(i,1,m) { int x,y; scanf("%d%d",&x,&y); d[x]++; d[y]++; f[x][y]+=1.0; f[y][x]+=1.0; } fo(i,1,n) fo(j,1,n) if (d[j]) f[i][j]/=d[j]; fo(i,1,n) fo(j,1,n) f[i][j]*=rate-1; fo(i,1,n)f[i][i]+=1.0; f[1][n+1]=rate; gauss(); fo(i,1,n)printf("%.9lf\n",ans[i]); return 0;}
- BZOJ1778 [Usaco2010 Hol]Dotp 驱逐猪猡
- BZOJ1778: [Usaco2010 Hol]Dotp 驱逐猪猡
- bzoj1778 [Usaco2010 Hol]Dotp 驱逐猪猡
- 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡【概率DP】【高斯消元】
- BZOJ 1778 [Usaco2010 Hol] Dotp 驱逐猪猡
- BZOJ 1778 Usaco2010 Hol Dotp 驱逐猪猡 期望DP+高斯消元
- bzoj 1778 [Usaco2010 Hol]Dotp 驱逐猪猡 高斯消元
- BZOJ 1778 Usaco2010 驱逐猪猡
- bzoj1778 驱逐猪猡 [高斯消元+概率DP]
- bzoj 1776: [Usaco2010 Hol]cowpol 奶牛政坛
- [BZOJ1776] [Usaco2010 Hol]cowpol 奶牛政坛
- bzoj1776[Usaco2010 Hol]cowpol 奶牛政坛
- bzoj1777[Usaco2010 Hol]rocks 石头木头
- 【RMQ&LCA】[Usaco2010 Hol]cowpol…
- bzoj 1779: [Usaco2010 Hol]Cowwar 奶牛战争 (网络流)
- [BZOJ1779][Usaco2010 Hol]Cowwar 奶牛战争(最大流)
- [BZOJ1779][Usaco2010 Hol]Cowwar 奶牛战争(最大流)
- [bzoj4779][Usaco2010 Hol]Cowwar 奶牛战争 最大流
- WAV格式文件分析
- POJ3254 Corn Fields 【状压DP入门】
- qt quick 串口终端程序(qml 与 c++交互实例)
- BZOJ1003 物流运输 (DP spfa)
- python huey 轻量级异步任务队列简介
- bzoj1778 [Usaco2010 Hol]Dotp 驱逐猪猡
- 【Android】最强 Android Studio 使用小技巧和快捷键
- [学习]Linux RE
- 线上问题排查命令总结
- Qcom android L ro.sf.lcd_density属性修改
- J. City traffic tarjan缩点 11TH BUPT Collegiate Programming Contest
- Linux中的软件下载(g++,gdb,TagList插件,WinManager ,ctags)
- MySQL查看、创建和删除索引的方法(转载)
- Android单元测试