题目链接: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. Spring Boot Starters介绍

    文章目录 Web Start Test Starter Data JPA Starter Mail Starter 结论 对于任何一个复杂项目来说,依赖关系都是一个非常需要注意和消息的方面,虽然重要, ...

  2. rabbitMQ安装docker版 /权限管理命令

    1.进入docker hub镜像仓库地址:https://hub.docker.com/ 2.搜素rabbitMQ 查询镜像,可以看到多种类型,选择带有web页面的(managment) 3.拉取镜像 ...

  3. python 类C数组的两种形式:list -->内容可变, tuple --->内容不可变

    python 中的列表相当与 C 中的数组,列表:list 初始化使用[ ], 元组:tuple 初始化使用(): 一.列表list 1 #!/usr/bin/python  2   3 #list初 ...

  4. FastReport.Net中使用列表和数组作为报表数据源

    大多数现代报告工具允许您使用几乎任何数据库,然而,并不是所有报表工具都能以一个数据源的列表或数组来工作.本文中将展示如何使用FastReport .Net报表工具来实现. 请注意以下重要几点: 清单中 ...

  5. 清北学堂—2020.3NOIP数学精讲营—Day 1 morning 重点笔记

    qbxt Day 1 morning 重点笔记 --2020.3.8 济南 主讲:钟皓曦 1 正数%负数==正数 负数%正数==负数 负数%负数==负数 a%b的答案的符号取决于a的符号. 2 快速幂 ...

  6. Linux(Ubuntu) MySQL数据库安装与卸载

    安装 修改远程访问 卸载 安装 首先检查系统中是否已经安装了MySQL sudo netstat -tap | grep mysql 没有显示已安装结果,则没有安装 如若已安装,可以选择删除.(删除方 ...

  7. ACM入门问题:最大利益问题

    设最大的利益为maxv,最小值为minv 1.求最大利益的简单算法 ;j<=n-;j++) ;i<=j-;i++) maxv =(maxv与R[j]-R[i]中较大的一个) maxv=ma ...

  8. SSM家庭财务管理系统

    包含[项目源码+论文]:http://mp.toutiao.com/preview_article/?pgc_id=6805534721838154254

  9. Qt之connect

    Qt4之connect 基本用法 connect(ui->toolButton, SIGNAL(clicked()), this, SLOT(OnClickButton())); disconn ...

  10. 关于网上quartus ii 生成fft核出现问题解决

    ------------恢复内容开始------------ 关于网上quartus ii 生成fft核出现问题解决 1:必须把软件破解啦 2:必须把IP核破解啦 破解步骤网上也有可以直接看,一定要全 ...