1. 程式人生 > >【洛谷P2420】讓我們異或吧【DFS】

【洛谷P2420】讓我們異或吧【DFS】

題目大意:

思路:

首先,這到題是我在想刷LCALCA的時候遇到的,結果這道標籤是LCALCA的題目我卻想不到為什們要用LCALCA,一個DFSDFS就可以過。 其實要求兩個點的路徑異或值就是xor[root][x]xor[root][x]^xor[root][y]xor[root][y],因為重複的路徑會被重複異或掉,就變成了0。 一邊DFSDFS就可以求出所有點到rootroot的路徑異或值,然後就可以O(1)O(1)輸出了。

程式碼:

#include <cstdio>
#include
<cstring>
#define N 100100 using namespace std; int n,m,tot,x,y,z,Xor[N],head[N]; struct edge { int next,to,dis; }e[N*2]; void add(int from,int to,int dis) { e[++tot].to=to; e[tot].dis=dis; e[tot].next=head[from]; head[from]=tot; } void dfs(int x,int fa,int k) { Xor[x]=k; //記錄路徑異或值 for (
int i=head[x];~i;i=e[i].next) if (e[i].to!=fa) dfs(e[i].to,x,k^e[i].dis); } int main() { memset(head,-1,sizeof(head)); scanf("%d",&n); for (int i=1;i<n;i++) { scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } dfs(1,0,0); scanf("%d",&m); while (m--) { scanf
("%d%d",&x,&y); printf("%d\n",Xor[x]^Xor[y]); } return 0; }