[BZOJ3143][Hnoi2013][概率与期望][高斯消元]游走
2017-03-17 21:51
405 查看
可以列出走到每个点的期望次数的方程组,高斯消元
经过每条边的期望次数就是经过两个端点的期望次数除以度数的和
经过每条边的期望次数就是经过两个端点的期望次数除以度数的和
#include <cstdio> #include <cmath> #include <iostream> #include <algorithm> #define N 510 #define eps 1e-9 using namespace std; int n,m; int d ; double A ; double Ans; struct edge{ int u,v; double w; friend bool operator <(edge a,edge b){ return b.w-a.w>eps; } }E[N*N]; inline void gauss(){ int now=1; for(int i=1,j,k;i<=n;i++){ for(j=now;j<=n&&fabs(A[j][i])<eps;j++); if(j>n) continue; if(j!=now) for(k=1;k<=n+1;k++) swap(A[j][k],A[now][k]); double t=A[now][i]; for(j=1;j<=n+1;j++) A[now][j]/=t; for(j=1;j<=n;j++) if(j!=now){ t=A[j][i]; for(k=1;k<=n+1;k++) A[j][k]-=t*A[now][k]; } now++; } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ scanf("%d%d",&E[i].u,&E[i].v); d[E[i].u]++; d[E[i].v]++; } for(int i=1;i<=m;i++){ if(E[i].u!=n) A[E[i].v][E[i].u]=1.0/d[E[i].u]; if(E[i].v!=n) A[E[i].u][E[i].v]=1.0/d[E[i].v]; } for(int i=1;i<=n;i++) A[i][i]=-1; A[1][n+1]=-1; gauss(); for(int i=1;i<=m;i++){ if(E[i].u!=n) E[i].w+=A[E[i].u][n+1]/d[E[i].u]; if(E[i].v!=n) E[i].w+=A[E[i].v][n+1]/d[E[i].v]; } sort(E+1,E+1+m); for(int i=1;i<=m;i++) Ans+=E[i].w*(double)(m-i+1); printf("%.3lf\n",Ans); }
相关文章推荐
- BZOJ.3143.[HNOI2013]游走(概率 期望 高斯消元)
- bzoj 3143: [Hnoi2013]游走 (概率与期望+高斯消元)
- bzoj3143 [Hnoi2013]游走 (期望概率DP + 高斯消元)
- [BZOJ3143][Hnoi2013]游走(概率期望+高斯消元)
- bzoj 3143 [Hnoi2013]游走(贪心,高斯消元,期望方程)
- 【bzoj3143】[Hnoi2013]游走 期望dp+高斯消元
- BZOJ_3143_[Hnoi2013]游走_期望DP+高斯消元
- [BZOJ3143][HNOI2013]游走(期望+高斯消元)
- [期望DP+高斯消元] BZOJ3143: [Hnoi2013]游走
- 【数学期望】【高斯消元】bzoj3143 [Hnoi2013]游走
- BZOJ 3143: [Hnoi2013]游走 高斯消元 期望
- 【BZOJ 3143】【Hnoi2013】游走 期望+高斯消元
- 【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元
- 3143: [Hnoi2013]游走 概率与期望 高斯消元解期望方程组
- 【BZOJ3143】【Hnoi2013】 游走 期望DP 高斯消元
- bzoj 3143: [Hnoi2013]游走 期望dp+高斯消元
- 【BZOJ3143】[Hnoi2013]游走【高斯消元】【期望DP】【贪心】
- BZOJ 3143 HNOI2013 游走 期望DP+高斯消元
- 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元
- 【bzoj3143】[Hnoi2013]游走 高斯消元+期望方程