【luogu5651】 基础最短路练习题 [?]
开始只是打了个暴力 然后数组大小开错RE了 然后就没管了颓废去了 果然还是水题坐着舒服
题目保证不存在简单环使得边权异或和不为0 即所有环的权值异或和都为0 那么随便在那个点拆开的话断开的这两条路上的权值异或和都相同
所以就把环断开 将其变成一颗树 然后搞做
int tot=0,head[N];
struct edge{int v,w,nxt;}e[N<<2];
void add(int u,int v,int w){e[++tot]=(edge){v,w,head[u]},head[u]=tot;}
int dis[N];
void dfs(int u,int ff){
for(int i=head[u],v;i;i=e[i].nxt)
if((v=e[i].v)!=ff) dis[v]=dis[u]^e[i].w,dfs(v,u);
}
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int main(){
rd(n),rd(m),rd(Q);
for(int i=1;i<=n;++i) f[i]=i;
for(int i=1,u,v,w;i<=m;++i)
rd(u),rd(v),rd(w),(find(u)!=find(v))?(add(u,v,w),add(v,u,w),f[f[u]]=f[v]):0;
dfs(1,0);
for(int i=1,x,y;i<=Q;++i)
rd(x),rd(y),printf("%d\n",dis[x]^dis[y]);
return 0;
}