日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[HNOI2011]XOR和路径

發(fā)布時間:2023/11/29 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [HNOI2011]XOR和路径 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

嘟嘟嘟

一看到異或,就想到按位處理.
當(dāng)處理到第\(i\)位的時候,\(f[u]\)表示節(jié)點(diǎn)\(u\)\(n\)的路徑,這一位為\(1\)的期望,那么為\(0\)就是\(1 - f[u]\),于是有
\[f[u] = \frac{1}{d[u]} (\sum _ {v \in V, w = 0} f[v] + \sum _ {v \in V, w = 1} 1 - f[v])\]
因為是異或,所以如果邊權(quán)這一位是0的話,應(yīng)該加上\(f[v]\);否則加上\(1 - f[v]\)。
然后整理一下
\[d[u] * f[u] - \sum _ {v \in V, w = 0} f[v] + \sum _ {v \in V, w = 1} f[v] = \sum _ {v \in V, w = 1} 1\]
于是就可以高斯消元了。
答案為\(\sum 2 ^ i * ans_i[1]\)

需要注意的是,重邊只應(yīng)該加一次,對應(yīng)的度數(shù)也應(yīng)該只加\(1\)

#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<cstdlib> #include<cctype> #include<vector> #include<stack> #include<queue> using namespace std; #define enter puts("") #define space putchar(' ') #define Mem(a, x) memset(a, x, sizeof(a)) #define rg register typedef long long ll; typedef double db; const int INF = 0x3f3f3f3f; const db eps = 1e-8; const int maxn = 105; const int maxe = 2e4 + 5; inline ll read() {ll ans = 0;char ch = getchar(), last = ' ';while(!isdigit(ch)) last = ch, ch = getchar();while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();if(last == '-') ans = -ans;return ans; } inline void write(ll x) {if(x < 0) x = -x, putchar('-');if(x >= 10) write(x / 10);putchar(x % 10 + '0'); }int n, m, Max = 0; int du[maxn]; struct Edge {int nxt, to, w; }e[maxe]; int head[maxn], ecnt = -1; void addEdge(int x, int y, int w) {e[++ecnt] = (Edge){head[x], y, w};head[x] = ecnt; }db f[maxn][maxn], ans[maxn], Ans = 0; void build(int x) {Mem(f, 0);for(int i = 1; i < n; ++i) //小于n{f[i][i] = du[i];for(int j = head[i]; j != -1; j = e[j].nxt)if((e[j].w >> x) & 1) ++f[i][e[j].to], ++f[i][n + 1];else --f[i][e[j].to];} } db Gauss() {for(int i = 1; i <= n; ++i){int pos = i;for(int j = i + 1; j <= n; ++j)if(fabs(f[j][i]) > fabs(f[pos][i])) pos = j;if(pos != i) swap(f[i], f[pos]);db tp = f[i][i];if(fabs(tp) > eps) for(int j = i; j <= n + 1; ++j) f[i][j] /= tp;for(int j = i + 1; j <= n; ++j){db tp = f[j][i];for(int k = i; k <= n + 1; ++k) f[j][k] -= tp * f[i][k];}}for(int i = n; i; --i){ans[i] = f[i][n + 1];for(int j = i - 1; j; --j) f[j][n + 1] -= f[j][i] * f[i][n + 1];}return ans[1]; }int main() {Mem(head, -1);n = read(); m = read();for(int i = 1; i <= m; ++i){int x = read(), y = read(), w = read();addEdge(x, y, w); ++du[x];if(x ^ y) addEdge(y, x, w), ++du[y];Max = max(Max, w);}for(int i = 0; (1 << i) <= Max; ++i)build(i), Ans += Gauss() * (1 << i);printf("%.3lf\n", Ans);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/mrclr/p/10137454.html

總結(jié)

以上是生活随笔為你收集整理的[HNOI2011]XOR和路径的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。