题意:
给出一个联通图,存在自环和重边,边上带权。
要求:求出从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;
}
}
}