部落格觀賞效果更佳
給定乙個無向圖,點數和邊數<=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個結點。樹的每條邊上...