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

本文介绍了一种通过计算每个顶点经过次数的期望值来解决特定图论问题的方法,并使用了高斯消元法来求解线性方程组。通过贪心策略选择边权重,最终实现了对边经过次数期望的有效计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define eps 1e-10
int 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);
}

这里写图片描述

转载于:https://www.cnblogs.com/SiriusRen/p/6532101.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值