bzoj 2337

题意:
给出一个联通图,存在自环和重边,边上带权。
要求:求出从1点到n点的期望路径XOR和。

题解:
XOR嘛……容易想到拆位,对于0和1的边权肯定好处理。
然后,设计状态是f(u)表示从u到n的期望XOR和。
因为f(u) = P(期望为1) * 1 + P(期望为0) * 0
即f(u)也为到n点期望为1的概率。

然后,枚举边:
若权在此位为1,f(u) += (1 - f[v]) / deg(u)
否则, f(u) += f(v) / deg(u)

然后,高斯消元,感觉精度被卡,以后中间变量全部用 long double.

void gauss(int lim) {
    int r, c;
    for(r = 1, c = 1; r <= lim && c <= lim; r++, c++) {
        int maxr = 0; 
        rep(i, r, lim) if(fabs(a[i][c]) > fabs(a[maxr][c])) maxr = i; 
        if(fabs(a[maxr][c]) < eps) { r--; continue; }
        swap(a[r], a[maxr]); 
        rep(i, r + 1, lim) {
            if(fabs(a[i][c]) < eps) continue;
            long double T = a[i][c] / a[r][c];
            rep(j, c, lim + 1) a[i][j] -= T * a[r][j]; 
        }
    }
    per(i, lim, 1) {
        rep(j, 1, lim) 
            if(fabs(a[i][j]) > eps) {
                long double T = a[i][lim + 1]; 
                rep(k, j + 1, lim) T -= a[i][k] * f[k]; 
                f[j] = T / a[i][j]; 
                break; 
            }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值