【BZOJ 3143】 [Hnoi2013]游走 期望DP|高斯消元|贪心

来源:互联网 发布:淘宝怎么看全五星评价 编辑:程序博客网 时间:2024/05/17 02:57

每个 val表示 这个点经过几次

这样就明白了 我开始迷惑好长时间

#include <cstdio>#include <cmath>#include <iostream>#include <algorithm>using namespace std;const int MAXN=500+10; const double EPS=1e-6;double val[MAXN*MAXN],f[MAXN][MAXN],ans[MAXN*MAXN];int n,m,g[MAXN][MAXN],d[MAXN],s[MAXN*MAXN],t[MAXN*MAXN];void gauss(){for(int i=1;i<n;i++){int t=i;for(int j=i;j<n;j++)if(abs(f[i][j])>EPS){t=i;break;}if(i!=t)for(int j=i;j<n;j++) swap(f[i][j],f[t][j]);for(int j=i+1;j<n;j++){double tmp=f[j][i]/f[i][i];for(int k=i;k<=n;k++)f[j][k]-=tmp*f[i][k];}}for(int i=n-1;i>=1;i--){val[i]=f[i][n]/f[i][i];for(int j=i-1;j>=1;j--)f[j][n] -=val[i]*f[j][i];}} int main(){cin >>n >>m;for(int i=1;i<=m;i++) {scanf("%d %d",&s[i],&t[i]);g[s[i]][t[i]]++;g[t[i]][s[i]]++;d[s[i]]++;d[t[i]]++;}for(int i=1;i<n;i++)for(int j=1;j<n;j++){if(i==j) f[i][j]=1;else f[i][j]=-1.0*g[j][i]/d[j]; }f[1][n]=1; gauss();for(int i=1;i<=m;i++)ans[i]=val[s[i]]/d[s[i]]+val[t[i]]/d[t[i]];sort(ans+1,ans+m+1);double out=0;for(int i=1;i<=m;i++) out+=ans[i]*(m-i+1);printf("%.3lf",out);return 0;} 


没注意内存re3发 也是没谁了



0 0
原创粉丝点击