BZOJ 3143 高斯消元+贪心....

来源:互联网 发布:mac菜单栏死机 编辑:程序博客网 时间:2024/05/21 18:34

思路:
先算一下每条边经过次数的期望 转化为每个点经过次数的期望
边的期望=端点的期望/度数
统计一下度数 然后高斯消元
贪心附边权…….

//By SiriusRen#include <cmath>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define eps 1e-10int n,m,d[250050];double a[505][505],b[250050],ans;struct Point{int x,y;}e[250050];void Gauss(){    int i,j,k;double t;    for(i=1;i<=n;i++){        for(j=i;j<=n;j++)if(fabs(a[j][i])>eps)break;        if(j>n)continue;if(j!=i)swap(a[i],a[j]);        for(j=i+1;j<=n;j++)if(fabs(a[j][i]>eps)){            t=a[j][i]/a[i][i];            for(k=i;k<=n+1;k++)a[j][k]-=t*a[i][k];         }    }    for(int i=n;i;i--){        for(int j=i+1;j<=n;j++)a[i][n+1]-=a[i][j]*a[j][n+1];        a[i][n+1]/=a[i][i];    }}int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)        scanf("%d%d",&e[i].x,&e[i].y),        d[e[i].x]++,d[e[i].y]++;    for(int i=1;i<=m;i++)        a[e[i].x][e[i].y]+=1.0/d[e[i].y],        a[e[i].y][e[i].x]+=1.0/d[e[i].x];    for(int i=1;i<=n;i++)a[n][i]=0;    for(int i=1;i<=n;i++)a[i][i]=-1;    a[1][n+1]=-1;Gauss();    for(int i=1;i<=m;i++)b[i]=a[e[i].x][n+1]/d[e[i].x]+a[e[i].y][n+1]/d[e[i].y];    sort(b+1,b+1+m);    for(int i=1;i<=m;i++)ans+=b[i]*(m-i+1);    printf("%.3lf\n",ans);}

这里写图片描述

0 0