一、题面

POJ1984

二、分析

这题还是比较有意思的一题。

首先需要清楚的是,这题与普通并查集的区别在于它的节点之间的权值是二维的,因为是曼哈顿距离,肯定不能直接存距离,这样将不利于后面的路径压缩更新。

再看如何解题,先要把输入的数据存起来,因为后面是询问,关于方向的处理直接用正负即可。

存好数据后,每次进行询问时,对询问时间点前的进行合并,在并查集的路径压缩里注意这里还是使用了矢量的思想,具体的可以画两个矢量就出来了。

当查询的父节点相同时,表示是连通的,直接算曼哈顿距离就可以了。

当查询的父节点不相同时,表示不是连通的,输出-1。

三、AC代码

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. const int MAXN = 4e4+;
  10. //X Y 表示当前节点到父节点的X, Y相对距离
  11. //DX DY 表示 输入的两个节点 X, Y相对距离
  12. int X[MAXN], Y[MAXN], DX[MAXN], DY[MAXN];
  13. int First[MAXN], Second[MAXN];
  14. int Par[MAXN];
  15.  
  16. void Init()
  17. {
  18. memset(X, , sizeof(X));
  19. memset(Y, , sizeof(Y));
  20. memset(Par, -, sizeof(Par));
  21. }
  22.  
  23. int Find(int a)
  24. {
  25. if(Par[a] == -) return a;
  26. int t = Par[a];
  27. Par[a] = Find(Par[a]);
  28. X[a] += X[t];
  29. Y[a] += Y[t];
  30. return Par[a];
  31. }
  32.  
  33. void Union(int a, int b, int dx, int dy)
  34. {
  35. int fa = Find(a);
  36. int fb = Find(b);
  37. if(fa != fb)
  38. {
  39. Par[fa] = fb;
  40. X[fa] = X[b] + dx - X[a];
  41. Y[fa] = Y[b] + dy - Y[a];
  42. }
  43. }
  44.  
  45. int main()
  46. {
  47. //freopen("input.txt", "r", stdin);
  48. int N, M, T;
  49. while(scanf("%d %d", &N, &M)!=EOF)
  50. {
  51. Init();
  52. int len;
  53. char c;
  54. for(int i = ; i < M; i++)
  55. {
  56. scanf("%d %d %d %c", &First[i], &Second[i], &len, &c);
  57. switch(c)
  58. {
  59. case 'E': DX[i] = len, DY[i] = ; break;
  60. case 'W': DX[i] = -len, DY[i] = ; break;
  61. case 'N': DX[i] = , DY[i] = len; break;
  62. case 'S': DX[i] = , DY[i] = -len; break;
  63. }
  64. }
  65. scanf("%d", &T);
  66. int t, k = ;
  67. int u, v;
  68. for(int i = ; i < T; i++)
  69. {
  70. scanf("%d %d %d", &u, &v, &t);
  71. for(k; k < t; k++)
  72. {
  73. Union(First[k], Second[k], DX[k], DY[k]);
  74. }
  75. int fu = Find(u);
  76. int fv = Find(v);
  77. if(fu == fv)
  78. {
  79. printf("%d\n", abs(X[u] - X[v]) + abs(Y[u] - Y[v]));
  80. }
  81. else
  82. {
  83. printf("-1\n");
  84. }
  85.  
  86. }
  87.  
  88. }
  89. return ;
  90. }

POJ_1984 Navigation Nightmare 【并查集】的更多相关文章

  1. I - Navigation Nightmare 并查集

    Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1 ...

  2. POJ 1984 Navigation Nightmare 带全并查集

    Navigation Nightmare   Description Farmer John's pastoral neighborhood has N farms (2 <= N <= ...

  3. 【POJ 1984】Navigation Nightmare(带权并查集)

    Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40 ...

  4. BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集

    BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集 Description     农夫约翰有N(2≤N≤40000)个农场,标号1到N,M( ...

  5. POJ 1984 Navigation Nightmare 【经典带权并查集】

    任意门:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K To ...

  6. POJ1984:Navigation Nightmare(带权并查集)

    Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 7871   Accepted: 2 ...

  7. 带权并查集【bzoj3362】: [Usaco2004 Feb]Navigation Nightmare 导航噩梦

    [bzoj]3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦 ​ 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M(2≤M≤40000)条的不同的垂 ...

  8. POJ1984 Navigation Nightmare —— 种类并查集

    题目链接:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS   Memory Limit: 30000K T ...

  9. POJ 1984 - Navigation Nightmare - [带权并查集]

    题目链接:http://poj.org/problem?id=1984 Time Limit: 2000MS Memory Limit: 30000K Case Time Limit: 1000MS ...

随机推荐

  1. 【总结整理】AXURE原件

    iphone:750*1334 一般用分辨率的一半 移动的时候,按住shift拖动,可水平移动 框选的时候,箭头选择包含模式,只要不全部包含进来,就不会被选中 ctrl+'=显示背景网格 ctrl+s ...

  2. ubuntu18.04 按住只能删除一个字符bug

    只需要打开重复按键就可以了

  3. 581. Shortest Unsorted Continuous Subarray连续数组中的递增异常情况

    [抄题]: Given an integer array, you need to find one continuous subarray that if you only sort this su ...

  4. Python学习笔记_Python向Excel写入数据

    实验环境 1.OS:Win 10 64位 2.Python 3.7 3.如果没有安装xlwt库,则安装:pip install xlwt 下面是从网上找到的一段代码,网上这段代码,看首行注释行,是在L ...

  5. 面试题:bootstrap栅格系统

    Bootstrap是一个支持响应式的Css框架它提供了很多组件,如导航条,面板,菜单,form表单,还有栅格,而且他们这些都是支持响应式的,可以在各种设备上进行完美的展现.这里面我感觉最有价值的就是b ...

  6. python3--列表生成式

    # Auther: Aaron Fan # 原始的写法:a = []for i in range(10): a.append(i*2)print(a) # 用列表生成式完成上面的写法:a = [i*2 ...

  7. 使用EasyUI,关于日期格式的文本框按照正常方式获取不到值的问题

    这是个小菜在实际工作中遇到的问题,相信很多EasyUI新手很可能也遇到这样的问题,因此小菜觉得有必要拿出来分享一下. 这个问题要从EasyUI的datebox组件说起,小菜用这个组件的时候,发现用$( ...

  8. getContextPath、getServletPath、getRequestURI,getRealPath的区别

    假定你的web application 项目名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp 则执行下面向行代码后打印出如下 ...

  9. VMware下Ubuntu虚拟机NAT模式 连接Xshell

    1.Edit->Virtual NetWork Editor 2.选择NAT->NAT Settings 配置端口映射关系 很重要! Host port: 真实主机 一般是Windows端 ...

  10. poj1860 Currency Exchange(spfa判断正环)

    Description Several currency exchange points are working in our city. Let us suppose that each point ...