因为每个点爆炸概率相同,所以每个点被摧毁的概率就是这个点的期望出现次数/所有点的期望出现次数...
这就很简单了...随便高斯消元一发...
POPOQQQ还有一种很神的做法:
%Po姐http://blog.csdn.net/popoqqq/article/details/43481601
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> //by NeighThorn using namespace std; const int maxn=300+5; int n,m,p,q,d[maxn],mp[maxn][maxn]; double b,c,sum,a[maxn][maxn]; inline void gauss(void){ for(int i=1;i<=n;i++){ int k=i; while(!fabs(a[k][i])&&k<n) k++; if(i!=k) for(int j=1;j<=n+1;j++) swap(a[k][j],a[i][j]); for(int l=1;l<=n;l++) if(l!=i&&fabs(a[l][i])){ double lala=a[l][i]/a[i][i]; for(int s=1;s<=n+1;s++) a[l][s]-=lala*a[i][s]; } } for(int i=1;i<=n;i++) a[i][i]=a[i][n+1]/a[i][i]; } signed main(void){ scanf("%d%d%d%d",&n,&m,&p,&q); b=1.0*p/(double)q;c=1.0-b; for(int i=1,x,y;i<=m;i++) scanf("%d%d",&x,&y),mp[x][y]=mp[y][x]=1,d[x]++,d[y]++; for(int i=1;i<=n;i++){ a[i][i]=1.0; for(int j=1;j<=n;j++) if(mp[i][j]) a[i][j]+=-1.0*c/d[j]; } a[1][n+1]=1.0;gauss(); for(int i=1;i<=n;i++) sum+=a[i][i]; for(int i=1;i<=n;i++) printf("%.9f\n",a[i][i]/sum); return 0; }
By NeighThorn
BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡
原文:http://www.cnblogs.com/neighthorn/p/6443857.html