bzoj 1778 [Usaco2010 Hol]Dotp 驱逐猪猡 高斯消元
2016-11-30 20:36
344 查看
设f[i] 表示到i点的期望次数,mp[i][j] 表示i,j之间的边数,du[i] 表示点i的度数。
那么f[i]=∑f[j]∗(1−PQ)∗mp[i][j]du[j]+[i==1]
高斯消元解出f。设sum=∑f[i],那么点i的答案就是f[i]sum
注意eps至少1e-13
那么f[i]=∑f[j]∗(1−PQ)∗mp[i][j]du[j]+[i==1]
高斯消元解出f。设sum=∑f[i],那么点i的答案就是f[i]sum
注意eps至少1e-13
#include <bits/stdc++.h> using namespace std; #define N 310 #define eps 1e-15 #define ld long double int n,m; double P,Q; int mp ,du ; ld f ,sum; int main() { scanf("%d%d%lf%lf",&n,&m,&P,&Q); for(int i=1,x,y;i<=m;i++) { scanf("%d%d",&x,&y); mp[x][y]++;mp[y][x]++; du[x]++;du[y]++; } f[1][n+1]=1; for(int i=1;i<=n;i++) { f[i][i]=1; for(int j=1;j<=n;j++) if(mp[i][j]) f[i][j]+=((ld)P/Q-1)/du[j]*mp[i][j]; } for(int i=1;i<=n;i++) { int t=i; for(int j=i;j<=n;j++) if(fabs(f[j][i])>eps)t=j; for(int j=1;j<=n+1;j++) swap(f[i][j],f[t][j]); for(int j=1;j<=n;j++) if(j!=i&&fabs(f[j][i])>eps) { ld t=f[j][i]/f[i][i]; for(int k=1;k<=n+1;k++) f[j][k]-=f[i][k]*t; } } for(int i=1;i<=n;i++) sum+=(f[i][i]=f[i][n+1]/f[i][i]); for(int i=1;i<=n;i++) printf("%.9lf\n",(double)(f[i][i]/sum+eps)); return 0; }
相关文章推荐
- 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡【概率DP】【高斯消元】
- bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡【dp+高斯消元】
- 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元
- BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]
- bzoj 1778 [Usaco2010 Hol]Dotp 驱逐猪猡(高斯消元)
- BZOJ 1778 Usaco2010 Hol Dotp 驱逐猪猡 期望DP+高斯消元
- bzoj1778: [Usaco2010 Hol]Dotp 驱逐猪猡(概率DP+高斯消元)
- BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元
- BZOJ_1778_[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 Hol]Dotp 驱逐猪猡
- BZOJ1778 [Usaco2010 Hol]Dotp 驱逐猪猡
- BZOJ 1778 [Usaco2010 Hol] Dotp 驱逐猪猡
- BZOJ1778: [Usaco2010 Hol]Dotp 驱逐猪猡
- 【BZOJ】1778: [Usaco2010 Hol]Dotp 驱逐猪猡
- BZOJ1778: [Usaco2010 Hol]Dotp 驱逐猪猡
- BZOJ1778 [Usaco2010 Hol]Dotp 驱逐猪猡