POJ1984
题目链接: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的更多相关文章
- 【poj1984】 Navigation Nightmare
http://poj.org/problem?id=1984 (题目链接) 题意 给出一棵树,这棵树是以平面直角坐标系为基准建立的,也就是每个节点最多只有上下左右4条边.现在动态建树,同时询问两点间的 ...
- 并查集专辑 (poj1182食物链,hdu3038, poj1733, poj1984, zoj3261)
并查集专题训练地址,注册登录了才能看到题目 并查集是一个树形的数据结构, 可以用来处理集合的问题, 也可以用来维护动态连通性,或者元素之间关系的传递(关系必须具有传递性才能有并查集来维护,因为并查集 ...
- [POJ1984]Navigation Nightmare
[POJ1984]Navigation Nightmare 试题描述 Farmer John's pastoral neighborhood has N farms (2 <= N <= ...
- poj1984 带权并查集(向量处理)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5939 Accepted: 2 ...
- poj1984 带权并查集
题意:有多个点,在平面上位于坐标点上,给出一些关系,表示某个点在某个点的正东/西/南/北方向多少距离,然后给出一系列询问,表示在第几个关系给出后询问某两点的曼哈顿距离,或者未知则输出-1. 只要在元素 ...
- poj1984(带权并查集)
题目链接:http://poj.org/problem?id=1984 题意:给定n个farm,m条边连接farm,k组询问,询问根据前t3条边求t1到t2的曼哈顿距离,若不可求则输出-1. 思路:类 ...
- POJ1984:Navigation Nightmare(带权并查集)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 7871 Accepted: 2 ...
- POJ1984 Navigation Nightmare —— 种类并查集
题目链接:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K T ...
- poj1984并查集的相对偏移
#include<stdio.h>//典型题 #include<math.h> #define N 40010 struct node { int x,y,z; }pre[N] ...
随机推荐
- JDK14的新特性
文章目录 虽然JDK13在今年的9月17号才发布,但是丝毫不会影响到下一个版本JDK14的开发工作.听说官方定的新功能马上就要官宣了,我们这里不妨来提前推断一下. 在9月17号的发布中,Oracle提 ...
- rabbitMQ本地安装(Mac版)
一. 首先测试本机器是否安装wget命令 (可以通过wget www.baidu.com来测试,如果有响应则可直接进入步骤二,如果报错或者提示未安装wget则需要先安装wget) 1http://ft ...
- css-position之fixed vs sticky
css-position之fixed vs sticky fixed(固定定位) 元素相对于浏览器窗口是固定的,即使是窗口滚动,元素也是固定的 sticky(粘性定位) 基于用户滚定动来进行定位的, ...
- RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别
RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别 先贴一段代码 public void logon(Http ...
- Failed building wheel for cytoolz
2019独角兽企业重金招聘Python工程师标准>>> 当我使用 pip instlal cytoolz 时, 报以下错误: error: Microsoft Visual C++ ...
- 国际站中国区,孟买上Redis 4.0 集群版
信息摘要: 国际站中国区,孟买上线Redis 4.0 集群版适用客户: 所有用户版本/规格功能: redis 4.0 集群版产品文档: https://www.alibabacloud.com/hel ...
- 使用mvp+rxjava+retrofit加载数据
将mvp和rxjava和retrofit简单整合的列子,让activity的代码不再那么臃肿,只负责显示数据. 关于mvp的介绍可以看这里, 关于Rxjava的介绍可以看这里; 关于retrofit的 ...
- .NET Core 反编译dll源码查看
一.可以通过JetBrains dotPeek进行反编译 二.可以通过.NET Reflector和VS自带的反编译工具查看
- 网络流 + 欧拉回路 = B - Sightseeing tour POJ - 1637
B - Sightseeing tour POJ - 1637 https://blog.csdn.net/qq_36551189/article/details/80905345 首先要了解一下欧拉 ...
- Oracle触发器之替代触发器
替代触发器 替代视图增删改操作.视图可以认为成逻辑上的一张表,类似于把一个sql语句的执行结果永久的像表存储到数据 库中,视图一般用来做查询. 创建视图的语法: create view 视图名称 as ...