【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;
}
posted @ 2019-11-13 21:25  委屈的咸鱼鱼鱼鱼  阅读(109)  评论(0编辑  收藏  举报