题目链接:https://vjudge.net/problem/POJ-1984

解题思路:并查集+离线操作。

  用dx[ ]和dy[ ]两个数组存储某点相对于该点所在集合的源头的方位,因此不难推知dx[ ]和dy[ ]要初始化为0。当把一个点依附到另一个点之上时所用的技巧值得细细体会。而finds( )函数则更是点睛之笔。

AC代码:

 #include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=+;
int fa[maxn],dx[maxn],dy[maxn];
struct input{
int F1,F2,L;
char D[];
}inode[maxn];
struct query{
int F1,F2,I,ind;
}qnode[];
bool cmp(const query &a,const query &b){
return a.I<b.I;
}
int finds(int temp){
if(fa[temp]==-)
return temp;
int tp=finds(fa[temp]);
dx[temp]+=dx[fa[temp]];
dy[temp]+=dy[fa[temp]];
return fa[temp]=tp;
}
int ans[];
int main(){
memset(fa,-,sizeof(fa));
memset(dx,,sizeof(dx));
memset(dy,,sizeof(dy));
int N,M,K;
scanf("%d%d",&N,&M);
for(int i=;i<M;i++)
scanf("%d%d%d%s",&inode[i].F1,&inode[i].F2,&inode[i].L,inode[i].D);
scanf("%d",&K);
for(int i=;i<K;i++){
scanf("%d%d%d",&qnode[i].F1,&qnode[i].F2,&qnode[i].I);
qnode[i].ind=i;
}
sort(qnode,qnode+K,cmp); int j=;
for(int i=;i<M;i++){
int t1=finds(inode[i].F1),t2=finds(inode[i].F2);
if(t1!=t2){
fa[t2]=t1;
if(inode[i].D[]=='N'){
dx[t2]=dx[inode[i].F1]-dx[inode[i].F2];
dy[t2]=dy[inode[i].F1]-dy[inode[i].F2]+inode[i].L;
}
else if(inode[i].D[]=='E'){
dx[t2]=dx[inode[i].F1]-dx[inode[i].F2]+inode[i].L;
dy[t2]=dy[inode[i].F1]-dy[inode[i].F2];
}
else if(inode[i].D[]=='W'){
dx[t2]=dx[inode[i].F1]-dx[inode[i].F2]-inode[i].L;
dy[t2]=dy[inode[i].F1]-dy[inode[i].F2];
}
else if(inode[i].D[]=='S'){
dx[t2]=dx[inode[i].F1]-dx[inode[i].F2];
dy[t2]=dy[inode[i].F1]-dy[inode[i].F2]-inode[i].L;
}
}
while(i==qnode[j].I-){
int tt1=finds(qnode[j].F1),tt2=finds(qnode[j].F2);
if(tt1!=tt2) ans[qnode[j].ind]=-;
else
ans[qnode[j].ind]=abs(dx[qnode[j].F1]-dx[qnode[j].F2])+abs(dy[qnode[j].F1]-dy[qnode[j].F2]);
j++;
}
}
for(int i=;i<K;i++) printf("%d\n",ans[i]);
return ;
}

POJ1984的更多相关文章

  1. 【poj1984】 Navigation Nightmare

    http://poj.org/problem?id=1984 (题目链接) 题意 给出一棵树,这棵树是以平面直角坐标系为基准建立的,也就是每个节点最多只有上下左右4条边.现在动态建树,同时询问两点间的 ...

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

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

  3. [POJ1984]Navigation Nightmare

    [POJ1984]Navigation Nightmare 试题描述 Farmer John's pastoral neighborhood has N farms (2 <= N <= ...

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

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

  5. poj1984 带权并查集

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

  6. poj1984(带权并查集)

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

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

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

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

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

  9. poj1984并查集的相对偏移

    #include<stdio.h>//典型题 #include<math.h> #define N 40010 struct node { int x,y,z; }pre[N] ...

随机推荐

  1. vue2.x学习笔记(三十二)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12684060.html. 深入响应式原理 vue最独特的特性之一,是其非侵入式(耦合度低)的响应式系统:数据模型仅 ...

  2. 【集群实战】inotify

    1. inotify简介 Inotify是一种强大的,细粒度的,异步的文件系统事件监控机制(软件). linux内核从2.6.13起,加入了Inotify支持,通过Inotify可以监控文件系统中添加 ...

  3. 7.JUC线程高级-生产消费问题&虚假唤醒

    描述 生产消费问题在java多线程的学习中是经常遇到的问题 ,多个线程共享通一个资源的时候会出现各种多线程中经常出现的各种问题. 实例说明 三个类:售货员Clerk,工厂Factory,消费者Cons ...

  4. Hawkeye部署Github监控系统

    2019独角兽企业重金招聘Python工程师标准>>> step1:python环境安装 #pwd /usr/local/soft #wget https://www.python. ...

  5. resetlogs 打开数据库时新生成日志位置问题

    若系统中缺少联机日志,以resetlogs方式重建控制文件,那么当我们以alter database open resetlogs方式打开数据库时,新生成的联机日志会位于何处? 一:下面分别讨论几种情 ...

  6. #Week3 Linear Regression with Multiple Variables

    一.Multiple Features 这节课主要引入了一些记号,假设现在有n个特征,那么: 为了便于用矩阵处理,令\(x_0=1\): 参数\(\theta\)是一个(n+1)*1维的向量,任一个训 ...

  7. 数组输出黑科技----fwrite()

    fwrite(const void*buffer,size_t size,size_t count,FILE*stream); (1)buffer:是一个指针,对fwrite来说,是要输出数据的地址. ...

  8. lintcode 826电脑维修

    826,一个n * m矩阵代表一个电脑的阵列,给你一个list< Point >代表坏掉的电脑坐标.现在我们从(0,0)出发修电脑,要求:   1.必须修完当前行所有坏掉的电脑才能走向下一 ...

  9. Java方法重写

    重写override 为什么要重写方法呢? 1:当父类中的方法无法满足子类需求时候,重写方法 2:当子类需要有特有的功能时候,重写方法. Java方法重载:在同一类中,出现多个方法名相同的方法,但是参 ...

  10. Eating Everything Efficiently(反向dp)

    传送门 取最大值即可.用拓扑,dfs都可以实现 #include <bits/stdc++.h> using namespace std; const int maxn=500009; i ...