• G. SlavicG‘s Favorite Problem(树的遍历DFS,BFS均可)


    Problem - G - Codeforces

    给你一棵有n个顶点的加权树。回顾一下,树是一个没有任何循环的连接图。加权树是一棵树,其中每条边都有一定的权重。这棵树是无定向的,它没有根。

    由于树让你感到厌烦,你决定挑战自己,在给定的树上玩一个游戏。

    在一次移动中,你可以从一个节点移动到它的一个邻居(与它有直接边的另一个节点)。

    当你通过边i时,x的值变为x XOR wi(其中wi是第i条边的权重)。

    你的任务是从顶点a到顶点b,但你被允许进入节点b,当且仅当旅行到它之后,x的值将变成0。换句话说,你只能通过使用边i,使x XOR wi=0来旅行到节点b。

    此外,你可以在任何时间点最多传送一次到任何顶点,除了顶点b。你可以从任何顶点传送,甚至从a点传送。

    如果你能从a到达顶点b,则回答 "是",否则回答 "否"。

    请注意,XOR代表位XOR操作。

    输入
    第一行包含一个整数t(1≤t≤1000)--测试案例的数量。

    每个测试案例的第一行包含三个整数n、a和b(2≤n≤105),(1≤a,b≤n;a≠b)--分别是顶点的数量,以及起始节点和期望的结束节点。

    接下来的n-1行中的每一行表示树的一条边。边缘i由三个整数ui、vi和wi表示--它连接的顶点的标签(1≤ui,vi≤n;ui≠vi;1≤wi≤109)和各自边缘的权重。

    保证所有测试案例的n之和不超过105。

    输出
    对于每个测试案例,如果你能到达顶点b,则输出 "YES",否则输出 "NO"。

    例子
    输入复制
    3
    5 1 4
    1 3 1
    2 3 2
    4 3 3
    3 5 1
    2 1 2
    1 2 2
    6 2 3
    1 2 1
    2 3 1
    3 4 1
    4 5 3
    5 6 5
    outputCopy

    没有

    注意
    对于第一个测试案例,我们可以从节点1到节点3,x从0变成1,然后我们从节点3到节点2,x变成等于3。现在,我们可以传送到节点3,从节点3到节点4,到达节点b,因为x最后变成等于0,所以我们应该回答 "是"。

    对于第二个测试案例,我们没有移动,因为我们不能传送到节点b,我们唯一的移动是前往节点2,这是不可能的,因为到达节点2时x不会等于0,所以我们应该回答 "不"。

    题解:
    我们必须搞清楚一点当你旅行到b后,x的值是必须为0的,也就是说走到b后就要停下了(很重要)

    a可以通过传送达到除b外的任意一点,并且每经过一条路径就要做^操作,

    我们不妨双向考虑,从起点与终点出发,如果a遍历到某一点的值,与b遍历到某一点的值相等,那么是不是可以让a直接传送到b遍历到的点,众所周知,两个相等的值^结果为0,最终到达b点的值也会为0

    1. #include<iostream>
    2. #include<algorithm>
    3. #include<cstring>
    4. #include<string>
    5. #include<map>
    6. #include<vector>
    7. #include<queue>
    8. using namespace std;
    9. vector<pair<int,int>> p[100050];
    10. int n,a,b;
    11. int f = 0;
    12. int dis[100050];
    13. int vis[100050];
    14. int dis1[100050];
    15. int vis1[100050];
    16. map<int,int> rr,ll;
    17. void bfs()
    18. {
    19. queue<int> q;
    20. q.push(a);
    21. dis[a] = 0;
    22. while(q.size())
    23. {
    24. auto ver = q.front();
    25. q.pop();
    26. if(vis[ver])
    27. continue;
    28. vis[ver] = 1;
    29. for(int i = 0;i < p[ver].size();i++)
    30. {
    31. auto j = p[ver][i];
    32. int ne = j.first;
    33. int ww = j.second;
    34. if(!vis[ne])
    35. {
    36. if(ne != b)
    37. {
    38. dis[ne] = ww^dis[ver];
    39. q.push(ne);
    40. }
    41. }
    42. }
    43. }
    44. }
    45. void bfs1()
    46. {
    47. queue<int> q;
    48. q.push(b);
    49. dis1[b] = 0;
    50. while(q.size())
    51. {
    52. auto ver = q.front();
    53. q.pop();
    54. if(vis1[ver])
    55. continue;
    56. vis1[ver] = 1;
    57. for(int i = 0;i < p[ver].size();i++)
    58. {
    59. auto j = p[ver][i];
    60. int ne = j.first;
    61. int ww = j.second;
    62. if(!vis1[ne])
    63. {
    64. dis1[ne] = ww^dis1[ver];
    65. rr[dis1[ne]] = 1;
    66. q.push(ne);
    67. }
    68. }
    69. }
    70. }
    71. void solve()
    72. {
    73. f = 0;
    74. cin >> n >> a >>b;
    75. rr.clear();
    76. ll.clear();
    77. for(int i = 1;i <= n;i++)
    78. {
    79. p[i].clear();
    80. vis[i] = 0;
    81. dis[i] = 0;
    82. vis1[i] = 0;
    83. dis1[i] = 0;
    84. }
    85. for(int i = 1;i < n;i++)
    86. {
    87. int l,r,w;
    88. cin >> l>>r>>w;
    89. p[l].push_back({r,w});
    90. p[r].push_back({l,w});
    91. }
    92. bfs();
    93. bfs1();
    94. for(int i = 1;i <= n;i++)
    95. {
    96. if(rr[dis[i]])
    97. {
    98. cout<<"YES\n";
    99. return ;
    100. }
    101. }
    102. cout<<"NO\n";
    103. }
    104. signed main()
    105. {
    106. int t = 1;
    107. cin >> t;
    108. while(t--)
    109. {
    110. solve();
    111. }
    112. }

     

  • 相关阅读:
    规避RDP协议被屏蔽,lanproxy+noVNC实现web远程桌面
    设计模式-10--多例模式(Multition pattern)
    分享如何筛选延误三天以上物流件
    MySQL性能优化顺序
    调整C / C ++编译器以在多核应用程序中获得最佳并行性能:第二部分
    艾美捷PEG-2000 DMG解决方案
    【Javaweb项目实战】黑马旅游网
    【笔试强训选择题】Day41.习题(错题)解析
    身份证识别系统(安卓)
    python如何升级?python3版本并且安装pip3
  • 原文地址:https://blog.csdn.net/m0_64158084/article/details/127980180