一、题面

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. 代理模式 静态代理、JDK动态代理、Cglib动态代理

    1 代理模式 使用代理模式时必须让代理类和被代理类实现相同的接口: 客户端通过代理类对象来调用被代理对象方法时,代理类对象会将所有方法的调用分派到被代理对象上进行反射执行: 在分派的过程中还可以添加前 ...

  2. SQL Server 索引维护:系统常见的索引问题

    在很多系统中,比如本人目前管理的数据库,索引经常被滥用,甚至使用DTA(数据库引擎优化顾问)来成批创建索引(DTA目前个人认为它的真正用处应该是在发现缺失的统计信息,在以前的项目中,用过一次DTA,里 ...

  3. Luogu 2886 [USACO07NOV]牛继电器Cow Relays

    BZOJ 1706权限题. 倍增$floyd$. 首先这道题有用的点最多只有$200$个,先离散化. 设$f_{p, i, j}$表示经过$2^p$条边从$i$到$j$的最短路,那么有转移$f_{p, ...

  4. 使用pycharm运行调试scrapy

    摘要 Scrapy是爬虫抓取框架,Pycharm是强大的python的IDE,为了方便使用需要在PyCharm对scrapy程序进行调试 python PyCharm Scrapy scrapy指令其 ...

  5. hdu1269 Tarjan强连通分量 模板(转)

    #include<stdio.h> #include<iostream> #include<vector> using namespace std; ; vecto ...

  6. 9.python 系统批量运维管理器之Fabric模块

    前面介绍了paramiko,pexpect模块,今天来说比较适合大型应用自动化部署的模块,或者执行系统命令的模块Fabric. Fabric 是一个 Python 的库,同时它也是一个命令行工具.它提 ...

  7. HTTP文件上传插件开发文档-JSP

    版权所有 2009-2016 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/http-u ...

  8. 编写高质量代码改善C#程序的157个建议——建议58:用抛出异常代替返回错误代码

    建议58:用抛出异常代替返回错误代码 CLR异常机制的优点: 正常控制流会被立即中止,无效值或状态不会在系统中继续传播. 提供了统一的处理错误的方法. 提供了在构造函数.操作符重载及属性中报告异常的遍 ...

  9. 编写高质量代码改善C#程序的157个建议——建议14: 正确实现浅拷贝和深拷贝

    建议14: 正确实现浅拷贝和深拷贝 为对象创建副本的技术称为拷贝(也叫克隆).我们将拷贝分为浅拷贝和深拷贝. 浅拷贝 将对象中的所有字段复制到新的对象(副本)中.其中,值类型字段的值被复制到副本中后, ...

  10. 关于同时查询父子名称的SQL查询语句的写法 id name parentId parentName .

    parentid是1就是id为1的公司的子公司 如图 查询出所有的信息后 由于我要呈现的是parentName 不是parentId所以想问下SQL语句怎么写 谢谢啦~~:) 解法: SELECT s ...