洛谷 3907 圈的異或 題解

2021-10-01 04:08:13 字數 1960 閱讀 8375

部落格觀賞效果更佳

給定乙個無向圖,點數和邊數<=50

<=50

<=5

0(但你完全珂以當成2e5

2e52e

5來做),邊有邊權,判斷這個圖是否每個環的邊權的異或和都是000。

暴力找每個環,根據dfs

dfsdf

s序維護異或和,然後用字首和維護這個環的異或和,判斷是否為0

00即珂。

首先維護dfs

dfsdf

s序是顯然的。然後維護一下vis

visvi

s,表示有沒有訪問過。

如果點u

uu能到乙個點v

vv,並且上乙個點是fafa

fa,滿足:v!=

fa

v!=fa

v!=fa且v

vv被訪問過了,那麼v

vv到u

uu這些點的dfs

dfsdf

s序是連續的且組成乙個環。

用s um

[i

]sum[i]

sum[i]

表示d fs

dfsdf

s序從1

11到i

ii這些點上面的邊的異或和。那麼,sum

[u

]sum[u]

sum[u]

異或s um

[v

]sum[v]

sum[v]

就是u

uu到v

vv除了最後一條邊的異或和了。然後我們再異或上最後一條邊,就是u

uu到v

vv這條,就是這個環的異或和。如果不是0

00,就不要繼續搜了。

然後暴力跑一遍即珂。這樣的話,時間複雜度就是o(n

+m

)o(n+m)

o(n+m)

了,很強。(那為什麼資料只有<=50

<=50

<=5

0?)

#include

using

namespace std;

namespace flandre_scarlet

ed[n<<3]

;int edgecount=0;

void

clear()

void

addedge

(int u,

int v,

int w=1)

; head[u]

=edgecount;

}void

add2

(int u,

int v,

int w=1)

intstart

(int u)

intto

(int u)

intnext

(int u)

intlabel

(int u)

}g;int n,m;

voidr1(

int&x)

void

input()

}bool vis[n]

;int sum[n]

;bool end=0;

void

dfs(

int u,

int f,

int s)

else

if(v!=f and sum[u]

^sum[v]

^g.label

(i))}}

void

soviet()

}puts

(end?

"no"

:"yes");

}#define flan void

flan ismywife()

}#undef int

//long long

}int

main()

洛谷 P3907 圈的異或

給出無向圖g,邊 ai,bi 的權是ci,判斷下列性質是否成立 對於任意圈c,其邊權的異或和是0 輸入格式 第1 行,1 個整數t,表示資料的組數。每組資料第1 行,2 個整數 n,m,表示圖g 點和邊的數量。m 行,每行3 個整數 ai,bi,ci,輸出格式 對每個資料輸出一行,yes 或者 no...

LCA 洛谷2420 讓我們異或吧 題解

給出一棵 n 個節點的樹,每條邊都有邊權。再給出 m個詢問,求 x y 路徑上邊權的異或值。看洛谷討論無意中看到這道題,一點進來發現竟然是道水題,於是水了部落格qaq。樹上路徑肯定是lca,但是由於是異或,會發現並沒有必要 只需要認為詢問是 x root 然後 ro ot y 就可以了,因為重複的那...

洛谷 2420 讓我們異或吧

題目描述 異或是一種神奇的運算,大部分人把它總結成不進製加法.在生活中 xor運算也很常見。比如,對於乙個問題的回答,是為1,否為0.那麼 a是否是男生 xor b是否是男生 a和b是否能夠成為情侶 好了,現在我們來製造和處理一些複雜的情況。比如我們將給出一顆樹,它很高興自己有n個結點。樹的每條邊上...