一、题面

POJ1984

二、分析

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

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

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

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

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

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

三、AC代码

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; const int MAXN = 4e4+;
//X Y 表示当前节点到父节点的X, Y相对距离
//DX DY 表示 输入的两个节点 X, Y相对距离
int X[MAXN], Y[MAXN], DX[MAXN], DY[MAXN];
int First[MAXN], Second[MAXN];
int Par[MAXN]; void Init()
{
memset(X, , sizeof(X));
memset(Y, , sizeof(Y));
memset(Par, -, sizeof(Par));
} int Find(int a)
{
if(Par[a] == -) return a;
int t = Par[a];
Par[a] = Find(Par[a]);
X[a] += X[t];
Y[a] += Y[t];
return Par[a];
} void Union(int a, int b, int dx, int dy)
{
int fa = Find(a);
int fb = Find(b);
if(fa != fb)
{
Par[fa] = fb;
X[fa] = X[b] + dx - X[a];
Y[fa] = Y[b] + dy - Y[a];
}
} int main()
{
//freopen("input.txt", "r", stdin);
int N, M, T;
while(scanf("%d %d", &N, &M)!=EOF)
{
Init();
int len;
char c;
for(int i = ; i < M; i++)
{
scanf("%d %d %d %c", &First[i], &Second[i], &len, &c);
switch(c)
{
case 'E': DX[i] = len, DY[i] = ; break;
case 'W': DX[i] = -len, DY[i] = ; break;
case 'N': DX[i] = , DY[i] = len; break;
case 'S': DX[i] = , DY[i] = -len; break;
}
}
scanf("%d", &T);
int t, k = ;
int u, v;
for(int i = ; i < T; i++)
{
scanf("%d %d %d", &u, &v, &t);
for(k; k < t; k++)
{
Union(First[k], Second[k], DX[k], DY[k]);
}
int fu = Find(u);
int fv = Find(v);
if(fu == fv)
{
printf("%d\n", abs(X[u] - X[v]) + abs(Y[u] - Y[v]));
}
else
{
printf("-1\n");
} } }
return ;
}

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. unity3d 为什么要烘焙?烘焙作用是为了什么?

    可以这样理解.你把物体模型放进了场景里之后, 引擎会计算光线,光线照到你的物体的表面形成反光和阴影. 如果不烘焙, 游戏运行的时候,这些反光和阴影都是由显卡和CPU计算出来的.你烘焙之后,这些反光和阴 ...

  2. Python父类调用子类

    首先说明,上面的标题其实是不正确的,Python是一门解释型.动态数据类型的高级语言,运行时,动态判断调用对象,其实还是子类自己在调用自己的方法或属性. 举个例子(copy过来的):SocketSer ...

  3. https://github.com/ildoonet/tf-pose-estimation

    https://github.com/ildoonet/tf-pose-estimation

  4. Django--登录实例

    1.准备工作 创建必要的目录和文件,导入js,css,bootstrap等,目录结构如下: 2.配置文件添加static路径 settings.py 1 2 3 4 STATIC_URL = '/st ...

  5. Luogu 3698 [CQOI2017]小Q的棋盘

    BZOJ 4813 虽然数据范围很迷人,但是想树形$dp$没有前途. 先发现一个事情,就是我们可以先选择一条链,最后要走到这一条链上不回来,走到链上的点每一个只需要一步,而如果要走这条链之外的点,一个 ...

  6. C# DateTime.ToString()的各种日期格式

    DateTime.ToString()的各种日期格式 例: ToString:2016/9/27 0:00:00 ToString("yyyy/MM/dd"):2016/09/27 ...

  7. py_initialize:C调Python出错 是初始化错误?

    还是pythonpath和pythonname变量没有配置正确? py_initialize()方法是什么? In an application embedding Python, this shou ...

  8. .net core .NET Core与.NET Framework、Mono之间的关系

    .NET Core与.NET Framework.Mono之间的关系 首先想要知道.NET Core与.NET Framework.Mono之间的关系,就必须他们分别是什么,有什么用途? 一. .ne ...

  9. 内联函数背景、例子、与普通函数的区别及要注意的地方 ------新标准c++程序设计

    背景: 使用函数能够避免将相同代码重些多次的烦恼,还能减少可执行程序的体积,但也会带来程序运行时间上的开销.函数调用在执行时,首先在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,接下 ...

  10. 《C#多线程编程实战》2.10 SpinWait

    emmm 这个SpinWait 中文是自旋等待的意思. 所谓自旋,就是自己追自己影子,周伯通的左右手互博,不好听就是放屁自己追着玩,小狗转圈咬自己的尾巴 SpinWait是一个结构体,并不是一个类. ...