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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS

發(fā)布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【BZOJ2115】[Wc2011] Xor

Description

Input

第一行包含兩個整數(shù)N和 M, 表示該無向圖中點的數(shù)目與邊的數(shù)目。 接下來M 行描述 M 條邊,每行三個整數(shù)Si,Ti ,Di,表示 Si 與Ti之間存在 一條權(quán)值為 Di的無向邊。 圖中可能有重邊或自環(huán)。

Output

僅包含一個整數(shù),表示最大的XOR和(十進制結(jié)果),注意輸出后加換行回車。

Sample Input

5 7
1 2 2
1 3 2
2 4 1
2 5 1
4 5 3
5 3 4
4 3 2

Sample Output

6

HINT

題解:以前用到DFS樹的情況比較少,現(xiàn)在需要在加深一下對DFS樹的理解了~

*結(jié)論:任意一條從1到n的路徑,都可以被任意令一條從1到n的路徑和一堆環(huán)替代。(因為是異或,所以顯然)

所以我們只需要任意找一條從1到n的路徑,然后再把所有的環(huán)都找出來。

但是我們這里的環(huán)不是Tarjan那里的環(huán),我們要找到的都是簡單環(huán),所以要用DFS(有什么區(qū)別?)

因為DFS樹(就是DFS找出的樹)有一個性質(zhì):沒有橫叉邊,所以每條返祖邊都唯一對應(yīng)一個簡單環(huán)。

那么現(xiàn)在問題就變成了給出一堆數(shù),可以選或不選,要求選出來的數(shù)和一個固定的數(shù)的異或和最大。

方法:網(wǎng)上大部分題解都說先搞出線性基,然后貪心就行了,然而本蒟蒻不知道什么是線性基,現(xiàn)去學(xué)了一發(fā)

高斯消元的過程,就是我們將一個滿秩的矩陣盡可能的消成一個上三角矩陣的過程,而我對線性基的理解就是:最后得到的那個近似于上三角的矩陣(因為有的位置可能沒有消完)。容易發(fā)現(xiàn),線性基可以表示原集合中的所有數(shù)。

所以你已經(jīng)知道了一個上三角矩陣,然后如何使得異或值最大呢?顯然從大到小一個一個試就行了嘛!如果當前位線性基不為0,但是原數(shù)為0,那就異或上這個數(shù)就行了。

?

#include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; int n,m,cnt,tot; int to[200010],next[200010],head[50010],vis[50010]; ll val[200010],v[500010],dis[50010],ans; void add(int a,int b,ll c) {to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++; } void dfs(int x,int fa) {vis[x]=1;for(int i=head[x];i!=-1;i=next[i]){if(to[i]==fa) continue;if(vis[to[i]]) v[++tot]=val[i]^dis[to[i]]^dis[x];else dis[to[i]]=dis[x]^val[i],dfs(to[i],x);} } void gauss() {ll i;int j,k=0;for(i=1ll<<60;i;i>>=1){for(k++,j=k;j<=tot;j++) if(v[j]&i){swap(v[j],v[k]);break;}if(!(v[k]&i)){k--; continue;}for(j=k+1;j<=tot;j++) if(v[j]&i) v[j]^=v[k];} } int main() {scanf("%d%d",&n,&m);int i,a,b;ll c;memset(head,-1,sizeof(head));for(i=1;i<=m;i++){scanf("%d%d%lld",&a,&b,&c);add(a,b,c),add(b,a,c);}dfs(1,0),gauss();ans=dis[n];for(i=1;i<=60&&i<=tot;i++) if((ans^v[i])>ans) ans^=v[i];printf("%lld",ans);return 0; }

?

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

總結(jié)

以上是生活随笔為你收集整理的【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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