码迷,mamicode.com
首页 > 其他好文 > 详细

【luogu5651】 基础最短路练习题 [?]

时间:2019-11-13 22:05:37      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:find   基础   class   ++i   不为   turn   pre   code   ++   

开始只是打了个暴力 然后数组大小开错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;
}

【luogu5651】 基础最短路练习题 [?]

标签:find   基础   class   ++i   不为   turn   pre   code   ++   

原文地址:https://www.cnblogs.com/lxyyyy/p/11853172.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!