• Codeforces Round #835 (Div. 4) G. SlavicG‘s Favorite Problem


    翻译:

    给您一个带有𝑛顶点的加权树。回想一下,树是一个没有任何循环的连通图。加权树是每条边都有一定权重的树。树是无向的,它没有根。

    因为树木让你厌烦,所以你决定挑战自己,在给定的树上玩一款游戏。

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

    你从一个变量𝑥开始,它最初等于0。当您通过边缘𝑖时,𝑥将其值更改为𝑥𝖷𝖮𝖱𝑤𝑖(其中𝑤𝑖是𝑖-th边缘的权重)。

    您的任务是从顶点𝑎到顶点𝑏,但是当且仅当到达节点𝑏后,𝑥的值将变为0时,允许您进入节点𝑏。换句话说,您只能通过使用边缘𝑖来访问节点𝑏,这样𝑥𝖷𝖮𝖱𝑤𝑖=0。一旦你进入节点𝑏,游戏就结束了,你就赢了。

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

    如果你能从𝑎到达顶点𝑏,回答“YES”,否则回答“NO”。

    注意,𝖷𝖮𝖱表示按位异或操作。

    输入
    第一行包含一个整数𝑡(1≤𝑡≤1000)——测试用例的数量。

    每个测试用例的第一行分别包含三个整数𝑛、𝑎和𝑏(2≤𝑛≤105),(1≤𝑎,𝑏≤𝑛;𝑎≠𝑏)——顶点的数量,以及起始节点和期望的结束节点。

    接下来的每一行𝑛−1表示树的一条边。边缘𝑖用三个整数𝑢𝑖,𝑣𝑖和𝑤𝑖——顶点连接的标签(1≤𝑢𝑖,𝑣𝑖≤𝑛;𝑢𝑖≠𝑣𝑖;1≤𝑤𝑖≤109)的重量和各自的优势。

    可以保证所有测试用例中𝑛的总和不超过105。

    输出
    对于每个测试用例,如果你能到达顶点𝑏,输出“YES”,否则输出“NO”。

    例子
    inputCopy
    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,𝑥从0变为1,然后我们从节点3移动到节点2,𝑥变为等于3。现在,我们可以传送到节点3,并从节点3移动到节点4,到达节点𝑏,因为𝑥最终变成了0,所以我们应该回答“YES”。

    对于第二个测试用例,我们没有移动,因为我们不能传送到节点𝑏,我们唯一的移动是移动到节点2,这是不可能的,因为𝑥到达节点2时不等于0,所以我们应该回答“no”。

    思路:

    无向图,a到达b路径上一直异或,到最后到达为0,中间可以传送到任何一个地点。那么我们只需要跑两个dfs,然后看知道到相互的点是否直接为0,或者有点有相同的值即可。

    代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. #include
    14. using namespace::std;
    15. typedef long long ll;
    16. int n,t;
    17. inline __int128 read(){
    18. __int128 x = 0, f = 1;
    19. char ch = getchar();
    20. while(ch < '0' || ch > '9'){
    21. if(ch == '-')
    22. f = -1;
    23. ch = getchar();
    24. }
    25. while(ch >= '0' && ch <= '9'){
    26. x = x * 10 + ch - '0';
    27. ch = getchar();
    28. }
    29. return x * f;
    30. }
    31. inline void print(__int128 x){
    32. if(x < 0){
    33. putchar('-');
    34. x = -x;
    35. }
    36. if(x > 9)
    37. print(x / 10);
    38. putchar(x % 10 + '0');
    39. }
    40. int a,b;
    41. int x,y,z;
    42. mapint>we;
    43. ll dd[100005];
    44. int jjk=0;
    45. setwee;
    46. vectorint,int>>q[100005];
    47. void dfs(int x,int fa){
    48. if (x==b) {
    49. if (dd[x]==0) {
    50. jjk=1;
    51. }
    52. return;
    53. }
    54. for (int i =0; isize(); i++) {
    55. if (q[x][i].first==fa) {
    56. continue;
    57. }
    58. dd[q[x][i].first]=dd[x]^q[x][i].second;
    59. if (q[x][i].first!=b) {
    60. we[dd[q[x][i].first]]=1;
    61. }
    62. dfs(q[x][i].first, x);
    63. }
    64. }
    65. void dfs2(int x,int fa){
    66. if (we[dd[x]]&&x!=b) {
    67. // printf("%d \n",x);
    68. // printf("dsa\n");
    69. jjk=1;
    70. }
    71. // if (dd[x]==0) {
    72. // jjk=1;
    73. // }
    74. for (int i =0; isize(); i++) {
    75. if (q[x][i].first==fa) {
    76. continue;
    77. }
    78. dd[q[x][i].first]=dd[x]^q[x][i].second;
    79. dfs2(q[x][i].first, x);
    80. }
    81. }
    82. void solv(){
    83. we.clear();
    84. jjk=0;
    85. cin>>n>>a>>b;
    86. for (int i =0; i<=n; i++) {
    87. q[i].clear();
    88. }
    89. for (int i =1; i
    90. cin>>x>>y>>z;
    91. q[x].push_back({y,z});
    92. q[y].push_back({x,z});
    93. }
    94. // if (n==2) {
    95. // printf("NO\n");return;
    96. // }
    97. // for (int i =1; i<=n; i++) {
    98. // dd[i]=0;
    99. // }
    100. //
    101. dd[a]=0;
    102. dfs(a,a);
    103. // for (int i =1; i<=n; i++) {
    104. // printf("%lld ",dd[i]);
    105. // }printf("\n");
    106. // for (int i =1; i<=n; i++) {
    107. // dd[i]=0;
    108. // }
    109. dd[b]=0;
    110. we[0]=1;
    111. dfs2(b, b);
    112. // for (int i =1; i<=n; i++) {
    113. // printf("%lld ",dd[i]);
    114. // }printf("\n");
    115. if (jjk) {
    116. printf("YES\n");return;
    117. }printf("NO\n");
    118. // 4
    119. // 4 3 2
    120. // 3 1 1
    121. // 1 4 1
    122. // 1 2 3
    123. }
    124. int main(){
    125. ios::sync_with_stdio(false);
    126. cin.tie(); cout.tie();
    127. cin>>t;
    128. while (t--) {
    129. solv();
    130. }
    131. return 0;
    132. }
    133.  

     

  • 相关阅读:
    PCA(Principal Component Analysis,主成分分析)与矩阵X的协方差矩阵之间的联系
    【Tensorflow深度学习】实现手写字体识别、预测实战(附源码和数据集 超详细)
    【Spring Boot】数据缓存Redis实现高并发 —— Redis入门
    使用Cython将Python代码转为C语言,从而提高代码保密性
    【git】项目本地文件和远端不一致,如何初始化提交git项目
    全面总结 Vue 3.0 的新特性!手把手教你如何入门Vue3.0(适合小白的保姆级教程)【尚硅谷vuejs3.0笔记】
    Bio-Helix 艾美捷IRIS11预染蛋白Markers基参及相关研究
    git创建分支
    几个网站的百度收录都被清空,对方这是什么操作?怎么破?
    关于物联网你需要知道的一切
  • 原文地址:https://blog.csdn.net/weixin_63555280/article/details/128107552