题目链接: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. java制作一个简单的抽签程序

    首先需要导入import java.util.Random;才能使用随机类Random:Random生成随机数介绍:https://www.cnblogs.com/prodigal-son/p/128 ...

  2. 【JAVA基础】08 面向对象3

    1. 多态 多态polymorhic概述 事物存在的多种形态. 多态前提 要有继承关系 要有方法重写 要有父类引用指向子类对象 案例演示 代码体现多态 class Demo1_Polymorphic{ ...

  3. 基于ONOS的T-SDN Super控制器,突破多域网络运营的难关

    在法国尼斯举办的IIR WDM波分论坛(Next Generation Optical Networking)上,华为展示了T-SDN(Transport SDN,传送SDN)领域的众多新技术,其中T ...

  4. 自定义View之Canvas使用

    自定义View的绘制流程一般都是这样:提前创建好Paint对象,重写onDraw(),把绘制代码卸载ondraw()里面,大致如下: Paint paint = new Paint(); @Overr ...

  5. Math.Round和四舍五入

    Math.Round方法并不是像想象中的四舍五入, 可以从下面的输出结果看出来: Math.Round(3.44, 1); //Returns 3.4. Math.Round(3.45, 1); // ...

  6. 算法竞赛进阶指南--hamilton路径

    // hamilton路径 int f[1 << 20][20]; int hamilton(int n, int weight[20][20]) { memset(f, 0x3f, si ...

  7. 0x01-Linux常用文件处理命令

    0x01-Linux常用文件处理命令 摘要 文件可以说是占据了Linux系统半壁江山,那么,我们理所应当要认识文件,且还要懂得如何创建.查看文件(touch.cat命令).既然是使用Linux,当然是 ...

  8. Linux之进程管理工具supervisor

    环境:CentOS 7官方文档:http://supervisord.org/ 安装 # yum install -y epel-release # yum install -y supervisor ...

  9. Java——多线程之方法详解

    Java多线程系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多 ...

  10. 设计模式(Java语言)- 建造者模式

    前言 在日常的生活中,我们可以经常看到建造者模式的影子.比如,建造房子,那么房子就是一个产品,房子由门,窗,墙,地板等部门组成.然后包工头在建造房子的时候就根据设计好的图纸来建造,但是包工头并不是亲自 ...