因为每个点爆炸概率相同,所以每个点被摧毁的概率就是这个点的期望出现次数/所有点的期望出现次数...
这就很简单了...随便高斯消元一发...
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