博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
题解 p2420 让我们异或吧
阅读量:5356 次
发布时间:2019-06-15

本文共 1132 字,大约阅读时间需要 3 分钟。

1 #include
2 #include
3 #include
4 using namespace std; 5 const int N=100005;int x,y,z; 6 int n,m,k=0,head[N],dis[N];bool vis[N]; 7 struct node{
int to,next,w;}edge[N<<1]; 8 //无向图存边数组开两倍 9 void add(int u,int v,int w){10 edge[++k].to=v;edge[k].next=head[u];edge[k].w=w;head[u]=k;11 }12 void dfs(int now,int val){13 //dis[tmp]^dis[tmp]^dis[u]^dis[v]=dis[u]^dis[v]14 //所以只要求每一个和根节点的异或值就可以了 15 dis[now]=val;vis[now]=true;16 //now到根节点的异或边权即为val17 //这个点已经找过了 18 for(register int i=head[now];i;i=edge[i].next){19 //从这个点所在的图的边的起点开始向后找 20 if(!vis[edge[i].to]) dfs(edge[i].to,val^edge[i].w);21 //如果在这个没有搜过,就顺着向下搜,异或值就是现在的^要走过的 22 }23 }24 int main(){25 scanf("%d",&n);26 for(register int i=1;i<=n-1;i++){27 scanf("%d%d%d",&x,&y,&z);28 add(x,y,z);add(y,x,z);29 }30 dfs(1,0);/*从根节点开始找,根节点和自己的异或值就是零*/scanf("%d",&m);31 for(register int i=1;i<=m;i++){32 scanf("%d%d",&x,&y);33 printf("%d\n",dis[x]^dis[y]);34 } 35 }

 

 
 
 

转载于:https://www.cnblogs.com/fallen-down/p/10776446.html

你可能感兴趣的文章
20135202闫佳歆——信息安全系统设计基础第九周学习总结
查看>>
C++知识点
查看>>
借鉴Glide思想二次封装Fresco
查看>>
洛谷 P3355 骑士共存问题
查看>>
SQL数据库抽像工厂类
查看>>
2018.6.16 PHP小实验
查看>>
Eclipse插件开发(原书第3版)
查看>>
使用资源本地化 ASP.NET 网页
查看>>
顺序查找
查看>>
单例模式
查看>>
Window.document对象
查看>>
ASP.NET 执行bat文件。
查看>>
Java之SimpleDateFormat日期格式转换(Date 和 String 类型之间的转换)
查看>>
自动摘要算法
查看>>
跨域问题&cors解决跨域
查看>>
第二节(标识符,关键字,数据类型,运算符)
查看>>
jsp:incloud用法
查看>>
自己写的主从查询代码
查看>>
jar包反复下载不成功
查看>>
pycharm远程linux开发和调试代码
查看>>