题目链接:http://poj.org/problem?id=1984

题目大意:有n个点,在平面上位于坐标点上,给出m关系F1  F2  L  D ,表示点F1往D方向走L距离到点F2,然后给出一系列询问F1   F2  I,表示在第I个关系给出后询问F1和F2两点间的曼哈顿距离,或者未知则输出-1。

解题思路:带权并查集,但是要开二维,val[][0]表示上下(南北)方向的偏移量,val[][1]表示左右(东西)方向的偏移量,然后一直更新就好,记得两个维度都要一起更新。

代码:

 #include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e4+;
int root[N],val[N][],res[N];//val[][]用来记录权值,val[][0]表示南北方向的偏移量,val[][1]表示东西方向的偏移量 struct node{
int a,b,len;
char det[];
}arr[N]; struct Node{
int a,b,id;
Node(){}
Node(int l,int r,int c){
a=l;
b=r;
id=c;
}
};
vector<Node>v[N]; int find(int x){
if(root[x]==x)
return x;
int tmp=find(root[x]);
val[x][]+=val[root[x]][];
val[x][]+=val[root[x]][];
return root[x]=tmp;
} int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
root[i]=i;
}
for(int i=;i<=m;i++){
scanf("%d%d%d%s",&arr[i].a,&arr[i].b,&arr[i].len,arr[i].det);
}
int q;
scanf("%d",&q);
for(int i=;i<=q;i++){
int a,b,num;
scanf("%d%d%d",&a,&b,&num);
v[num].push_back(Node(a,b,i));
} for(int i=;i<=m;i++){
int a=arr[i].a,b=arr[i].b,len=arr[i].len;
int t1=find(a);
int t2=find(b);
if(t1!=t2){
root[t2]=t1;
if(arr[i].det[]=='N'){
val[t2][]=val[a][]-val[b][]+len;//val[t2][0]+val[b][0]=val[a][0]+len即a点向北走len距离到b点
val[t2][]=val[a][]-val[b][];//东西方向没有发生偏移
}
if(arr[i].det[]=='S'){
val[t2][]=val[a][]-val[b][]-len;//val[t2][0]+val[b][0]=val[a][0]+len即a点向南走len距离到b点
val[t2][]=val[a][]-val[b][];
}
if(arr[i].det[]=='W'){
val[t2][]=val[a][]-val[b][]-len;//同理
val[t2][]=val[a][]-val[b][];
}
if(arr[i].det[]=='E'){
val[t2][]=val[a][]-val[b][]+len;
val[t2][]=val[a][]-val[b][];
}
}
for(int j=;j<v[i].size();j++){
a=v[i][j].a;
b=v[i][j].b;
t1=find(a);
t2=find(b);
if(t1!=t2)//两点不在同一个并查集中则两点间没有通路
res[v[i][j].id]=-;
else
res[v[i][j].id]=abs(val[a][]-val[b][])+abs(val[a][]-val[b][]);
}
}
for(int i=;i<=q;i++){
printf("%d\n",res[i]);
}
return ;
}

POJ 1984 Navigation Nightmare(二维带权并查集)的更多相关文章

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

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

  2. 【poj 1984】&【bzoj 3362】Navigation Nightmare(图论--带权并查集)

    题意:平面上给出N个点,知道M个关于点X在点Y的正东/西/南/北方向的距离.问在刚给出一定关系之后其中2点的曼哈顿距离((x1,y1)与(x2,y2):l x1-x2 l+l y1-y2 l),未知则 ...

  3. [poj 2912] Rochambeau 解题报告 (带权并查集)

    题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...

  4. poj 1733 Parity game【hash+带权并查集】

    hash一下然后用带权并查集做模2下的前缀和 #include<iostream> #include<cstdio> #include<map> #include& ...

  5. POJ 2492 A Bug's Life 带权并查集

    题意: 思路: mod2 意义下的带权并查集 如果两只虫子是异性恋,它们的距离应该是1. 如果两只虫子相恋且距离为零,则它们是同性恋. (出题人好猥琐啊) 注意: 不能输入一半就break出来.... ...

  6. 【poj 1182】食物链(图论--带权并查集)

    题意:有3种动物A.B.C,形成一个"A吃B, B吃C,C吃A "的食物链.有一个人对N只这3类的动物有M种说法:第一种说法是"1 X Y",表示X和Y是同类. ...

  7. 【POJ 1988】 Cube Stacking (带权并查集)

    Cube Stacking Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)id ...

  8. POJ - 3728:The merchant (Tarjan 带权并查集)

    题意:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. 思路 ...

  9. POJ 2492 A Bug's Life (带权并查集 && 向量偏移)

    题意 : 给你 n 只虫且性别只有公母, 接下来给出 m 个关系, 这 m 个关系中都是代表这两只虫能够交配, 就是默认异性, 问你在给出的关系中有没有与异性交配这一事实相反的, 即同性之间给出了交配 ...

随机推荐

  1. 微软TTS语音引擎编程入门

    原文链接地址:http://www.jizhuomi.com/software/135.html   我们都使用过一些某某词霸的英语学习工具软件,它们大多都有朗读的功能,其实这就是利用的Windows ...

  2. HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)

    HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和) 点我挑战题目 题意分析 根据数据范围和询问次数的规模,应该不难看出是个数据结构题目,题目比较裸.题中包括以下命令: 1.Add(i ...

  3. bzoj1257: [CQOI2007]余数之和sum(数论)

    非常经典的题目... 要求 则有 实际上 最多只有2*sqrt(k)种取值,非常好证明 因为>=sqrt(k)的数除k下取整得到的数一定<=sqrt(k),而k除以<=sqrt(k) ...

  4. JavaScript非阻塞加载脚本

    As more and more sites evolve into “Web 2.0″ apps, the amount of JavaScript increases. This is a per ...

  5. 关于xml文件头部xmlsn

    样本: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://ww ...

  6. 题解【luoguP4053 bzojP1029 [JSOI2007]建筑抢修】

    洛谷题链 bzoj题链 PS: \(t_i\) : 在什么时候建筑 \(i\) 自爆 \(a_i\) : 修复 \(i\) 所花时间 题解 算法:贪心+堆维护 贪心策略: 直接按 \(t\) 贪心?显 ...

  7. [实战篇入门]01-POI读Excel

    这一章的内容就是告诉各位同学如何入门POI的简单使用,再之后我们还会学习如何封装模版,由于个人时间问题,不定期更新!如果有需要,请再QQ中联系我,好了,开始工作! 新建一个Java项目,首先需要一些列 ...

  8. 理解JavaScript的prototype和__proto__

    首先,要明确几个点: 1.在JS里,万物皆对象. 方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性__pro ...

  9. linux包安装,解压,压缩,包管理,环境变量

    linux 包安装,解压,压缩,包管理 centoscentos上有系统包管理器yum yum的配置一般有两种方式,一种是直接配置/etc目录下的yum.conf文件,另外一种是在/etc/yum.r ...

  10. Nginx+Tomcat关于Session的管理

    前言 Nginx+Tomcat对Session的管理一直有了解,但是一直没有实际操作一遍,本文从最简单的安装启动开始,通过实例的方式循序渐进的介绍了几种管理session的方式. nginx安装配置 ...