#include<stdio.h>//典型题

#include<math.h>

#define N 40010

struct node {

int x,y,z;

}pre[N];

struct fff{

int a,b,dis;

char s[2];

}map[N];//储存

int find(int x) {

if(x!=pre[x].z)  {

int h=pre[x].z;

pre[x].z=find(pre[x].z);

   pre[x].x=pre[x].x+pre[h].x;//路径压缩

pre[x].y=pre[x].y+pre[h].y;//

}

return pre[x].z;

}

void insert(int a,int b,int x,int y){

int f1=find(a);

int f2=find(b);

if(f1==f2)return ;

pre[f1].z=f2;

pre[f1].x=pre[b].x-pre[a].x-x;//原来b以a为参考,a以其根root1为参考,b以其根root2为参考。现在root1以a为参考,a以b为参考,b还是以root2为参考

pre[f1].y=pre[b].y-pre[a].y-y;//a-pre[a]-root,b-xy-a,b-pre[b]-root2.变为root1-负pre[a]-a,a-负xy-b,b-pre[b]-root2。故root1-负pre[a]+负xy+pre[b]-root2.其中pre[a],pre[b],

                              //代表其相当于a,b的坐标,xy相当于坐标法



}

int main() {

int n,m,i,j,k,a,b,c,x,y,f1,f2,len;

char ch;

while(scanf("%d%d",&n,&m)!=EOF) {

for(i=1;i<=m;i++) 

scanf("%d%d%d%s",&map[i].a,&map[i].b,&map[i].dis,map[i].s);

for(i=1;i<=n;i++) {

pre[i].z=i;

pre[i].x=pre[i].y=0;//初始化

}

scanf("%d",&k);

j=1;

while(k--) {

scanf("%d%d%d",&a,&b,&c);

for(i=j;i<=c;i++) {

ch=map[i].s[0];x=0;y=0;

if(ch=='N')
x=map[i].dis;

if(ch=='E')
y=map[i].dis;//以N,E为正方向

if(ch=='S') x=-map[i].dis;

if(ch=='W') y=-map[i].dis;

insert(map[i].a,map[i].b,x,y);

}

f1=find(a);

f2=find(b);

if(f1!=f2)//是否有同一根节点

printf("-1\n");

else {

len=abs(pre[a].x-pre[b].x)+abs(pre[a].y-pre[b].y);//曼哈顿距离

printf("%d\n",len);

}

j=c+1;//

}



}

return 0;

}

poj1984并查集的相对偏移的更多相关文章

  1. 并查集专辑 (poj1182食物链,hdu3038, poj1733, poj1984, zoj3261)

    并查集专题训练地址,注册登录了才能看到题目 并查集是一个树形的数据结构,  可以用来处理集合的问题, 也可以用来维护动态连通性,或者元素之间关系的传递(关系必须具有传递性才能有并查集来维护,因为并查集 ...

  2. poj1984 带权并查集(向量处理)

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

  3. poj1984 带权并查集

    题意:有多个点,在平面上位于坐标点上,给出一些关系,表示某个点在某个点的正东/西/南/北方向多少距离,然后给出一系列询问,表示在第几个关系给出后询问某两点的曼哈顿距离,或者未知则输出-1. 只要在元素 ...

  4. POJ 1182 食物链(并查集+偏移向量)题解

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 82346   Accepted: 24616 Description ...

  5. poj1984(带权并查集)

    题目链接:http://poj.org/problem?id=1984 题意:给定n个farm,m条边连接farm,k组询问,询问根据前t3条边求t1到t2的曼哈顿距离,若不可求则输出-1. 思路:类 ...

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

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

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

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

  8. POJ 1182 食物链 (带权并查集 && 向量偏移)

    题意 : 中文题就不说题意了…… 分析 : 通过普通并查集的整理归类, 能够单纯地知道某些元素是否在同一个集合内.但是题目不仅只有种类之分, 还有种类之间的关系, 即同类以及吃与被吃, 而且重点是题目 ...

  9. hdu 1829 A Bug's Life(分组并查集(偏移量))

    A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

随机推荐

  1. $.each遍历json对象(java将对象转化为json格式以及将json解析为普通对象)

    查看一个简单的jQuery的例子来遍历一个JavaScript数组对象. var json = [ {"id":"1","tagName": ...

  2. 如何隐藏electron窗体的菜单栏

    electron中默认带有顶部菜单栏,有时候我们的应用不需要. 再main.js文件中设置 const electron = require('electron') const path = requ ...

  3. 443 String Compression 压缩字符串

    给定一组字符,使用原地算法将其压缩.压缩后的长度必须始终小于或等于原数组长度.数组的每个元素应该是长度为1 的字符(不是 int 整数类型).在完成原地修改输入数组后,返回数组的新长度.进阶:你能否仅 ...

  4. ES6知识点汇总

    MDN镇楼: https://developer.mozilla.org/zh-CN/ 1.ES6新添加数据类型:symbol  -----------   https://developer.moz ...

  5. jsp中非空判断

    function中uname要和id的值相匹配,但是这样不专业,要显示我的专业性,我将使用document获得name的值来判断是否为空,应为这样是专业的写法,我要时刻记住我是专业的 <scri ...

  6. P1478 陶陶摘苹果(升级版)

    题目描述 又是一年秋季时,陶陶家的苹果树结了n个果子.陶陶又跑去摘苹果,这次她有一个a公分的椅子.当他手够不着时,他会站到椅子上再试试. 这次与NOIp2005普及组第一题不同的是:陶陶之前搬凳子,力 ...

  7. 使用Xamarin.Forms跨平台开发入门 Hello,Xamarin.Forms 第一部分 快速入门

    本文介绍了如何使用VisualStudio开发Xamarin.Forms 应用程序和使用Xamarin.Forms开发应用的基础知识,包括了构建和发布Xamarin.Forms应用的工具,概念和步骤. ...

  8. springmvc 的配置 annotation-config/annotation-drive/ component-scan 区别

    1. <context:annotation-config /> 作用隐式的配置注解的加载类,默认的加载了AutowiredAnnotationBeanPostProcessor(auto ...

  9. 使用Win7 64位旗舰版光盘映像安装Windows Home basic 64位操作系统

    工作当中需要安装Windows home basic 64位操作系统,苦于手头没有该版本的安装光盘,也没时间下载其安装映像.因此,在现有资源“cn_windows_7_ultimate_with_sp ...

  10. C/C++ 标准输入、输出

    一.分类 1.标准输入输出 键盘输入,显示器输出.2.文件输入输出 以外存为对象,即硬盘.光盘等.3.串输入输出 对内存中指定空间进行输入输出. 二.c语言中的输入输出 #include <st ...