BZOJ 1778 [Usaco2010 Hol]Dotp 驱逐猪猡 ——期望DP
思路和BZOJ 博物馆很像。
同样是高斯消元
#include <map> #include <ctime> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i=j;i<=k;++i) #define D(i,j,k) for (int i=j;i>=k;--i) #define maxn 100005 #define eps 1e-9 double a[350][350]; double ans[350]; int n,m,p,q; int h[maxn],to[maxn],ne[maxn],en=0,du[maxn]; void add(int a,int b) {to[en]=b;ne[en]=h[a];h[a]=en++;du[a]++;} void Gauss() { F(i,1,n) { int tmp=i; F(j,i+1,n) if (fabs(a[tmp][i])<fabs(a[j][i])) tmp=j; if (tmp!=i) F(j,i,n+1) swap(a[tmp][j],a[i][j]); F(j,i+1,n) if (j!=i) { double t=a[j][i]/a[i][i]; F(k,i,n+1) a[j][k]-=t*a[i][k]; } } D(i,n,1) { F(j,i+1,n) a[i][n+1]-=a[i][j]*ans[j]; ans[i]=a[i][n+1]/a[i][i]; } } int main() { scanf("%d%d%d%d",&n,&m,&p,&q); a[1][n+1]=1.0*p/q; F(i,1,m) { int x,y;scanf("%d%d",&x,&y); du[x]++;du[y]++; a[x][y]+=1.0; a[y][x]+=1.0; } F(i,1,n) F(j,1,n) if (du[j]) a[i][j]/=(double)du[j]; F(i,1,n) F(j,1,n) a[i][j]*=1.0*p/q-1; F(i,1,n) a[i][i]+=1; Gauss(); F(i,1,n) printf("%.9f\n",ans[i]); }