POJ 1984 Navigation Nightmare(二维带权并查集)
题目链接:http://poj.org/problem?id=1984
题目大意:有n个点,在平面上位于坐标点上,给出m关系F1 F2 L D ,表示点F1往D方向走L距离到点F2,然后给出一系列询问F1 F2 I,表示在第I个关系给出后询问F1和F2两点间的曼哈顿距离,或者未知则输出-1。
解题思路:带权并查集,但是要开二维,val[][0]表示上下(南北)方向的偏移量,val[][1]表示左右(东西)方向的偏移量,然后一直更新就好,记得两个维度都要一起更新。
代码:
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e4+;
int root[N],val[N][],res[N];//val[][]用来记录权值,val[][0]表示南北方向的偏移量,val[][1]表示东西方向的偏移量 struct node{
int a,b,len;
char det[];
}arr[N]; struct Node{
int a,b,id;
Node(){}
Node(int l,int r,int c){
a=l;
b=r;
id=c;
}
};
vector<Node>v[N]; int find(int x){
if(root[x]==x)
return x;
int tmp=find(root[x]);
val[x][]+=val[root[x]][];
val[x][]+=val[root[x]][];
return root[x]=tmp;
} int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
root[i]=i;
}
for(int i=;i<=m;i++){
scanf("%d%d%d%s",&arr[i].a,&arr[i].b,&arr[i].len,arr[i].det);
}
int q;
scanf("%d",&q);
for(int i=;i<=q;i++){
int a,b,num;
scanf("%d%d%d",&a,&b,&num);
v[num].push_back(Node(a,b,i));
} for(int i=;i<=m;i++){
int a=arr[i].a,b=arr[i].b,len=arr[i].len;
int t1=find(a);
int t2=find(b);
if(t1!=t2){
root[t2]=t1;
if(arr[i].det[]=='N'){
val[t2][]=val[a][]-val[b][]+len;//val[t2][0]+val[b][0]=val[a][0]+len即a点向北走len距离到b点
val[t2][]=val[a][]-val[b][];//东西方向没有发生偏移
}
if(arr[i].det[]=='S'){
val[t2][]=val[a][]-val[b][]-len;//val[t2][0]+val[b][0]=val[a][0]+len即a点向南走len距离到b点
val[t2][]=val[a][]-val[b][];
}
if(arr[i].det[]=='W'){
val[t2][]=val[a][]-val[b][]-len;//同理
val[t2][]=val[a][]-val[b][];
}
if(arr[i].det[]=='E'){
val[t2][]=val[a][]-val[b][]+len;
val[t2][]=val[a][]-val[b][];
}
}
for(int j=;j<v[i].size();j++){
a=v[i][j].a;
b=v[i][j].b;
t1=find(a);
t2=find(b);
if(t1!=t2)//两点不在同一个并查集中则两点间没有通路
res[v[i][j].id]=-;
else
res[v[i][j].id]=abs(val[a][]-val[b][])+abs(val[a][]-val[b][]);
}
}
for(int i=;i<=q;i++){
printf("%d\n",res[i]);
}
return ;
}
POJ 1984 Navigation Nightmare(二维带权并查集)的更多相关文章
- POJ 1984 Navigation Nightmare 【经典带权并查集】
任意门:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K To ...
- 【poj 1984】&【bzoj 3362】Navigation Nightmare(图论--带权并查集)
题意:平面上给出N个点,知道M个关于点X在点Y的正东/西/南/北方向的距离.问在刚给出一定关系之后其中2点的曼哈顿距离((x1,y1)与(x2,y2):l x1-x2 l+l y1-y2 l),未知则 ...
- [poj 2912] Rochambeau 解题报告 (带权并查集)
题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...
- poj 1733 Parity game【hash+带权并查集】
hash一下然后用带权并查集做模2下的前缀和 #include<iostream> #include<cstdio> #include<map> #include& ...
- POJ 2492 A Bug's Life 带权并查集
题意: 思路: mod2 意义下的带权并查集 如果两只虫子是异性恋,它们的距离应该是1. 如果两只虫子相恋且距离为零,则它们是同性恋. (出题人好猥琐啊) 注意: 不能输入一半就break出来.... ...
- 【poj 1182】食物链(图论--带权并查集)
题意:有3种动物A.B.C,形成一个"A吃B, B吃C,C吃A "的食物链.有一个人对N只这3类的动物有M种说法:第一种说法是"1 X Y",表示X和Y是同类. ...
- 【POJ 1988】 Cube Stacking (带权并查集)
Cube Stacking Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)id ...
- POJ - 3728:The merchant (Tarjan 带权并查集)
题意:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. 思路 ...
- POJ 2492 A Bug's Life (带权并查集 && 向量偏移)
题意 : 给你 n 只虫且性别只有公母, 接下来给出 m 个关系, 这 m 个关系中都是代表这两只虫能够交配, 就是默认异性, 问你在给出的关系中有没有与异性交配这一事实相反的, 即同性之间给出了交配 ...
随机推荐
- HDU4812 D tree 【点分治 + 乘法逆元】
D树 时间限制:10000/5000 MS(Java / Others)内存限制:102400/102400 K(Java / Others) 总共提交5400个已接受的提交1144 问题描述 南京理 ...
- PHP汉字转拼音
<?php/** *+------------------------------------------------------ * PHP 汉字转拼音 *+----------------- ...
- Linux之socket套接字编程20160704
介绍套接字之前,我们先看一下传输层的协议TCP与UDP: TCP协议与UDP协议的区别 首先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多人犯糊涂了,一直都是说TCP/IP协议与UD ...
- Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause().
解决方法: audio.load() let playPromise = audio.play() if (playPromise !== undefined) { playPromise.then( ...
- FreeRTOS - configASSERT(断言)的使用
原文地址:http://www.cnblogs.com/god-of-death/p/6891400.html FreeRTOS中的断言函数configASSERT()和标准C中的断言函数asser ...
- 常见一个新的maven web工程
使用Eclipse创建一个新的maven Web应用工程,步骤如下: 1.在Elipse中新建一个maven工程,点击next: 2.选择工程路径(此处使用默认的),点击next: 3.选择Arche ...
- 数学:BSGS
先来稍微回顾一下,我们已经会求模线性方程(包括其特殊情况乘法逆元) 我们还会进行幂取模的快速算法(模是质数用费马小定理,模一般情况用欧拉定理) 对于幂中指数特别大的情况,我们还延伸出了拓展欧拉定理来解 ...
- Data Mining的十种分析方法——摘自《市场研究网络版》谢邦昌教授
Data Mining的十种分析方法: 记忆基础推理法(Memory-Based Reasoning:MBR) 记忆基础推理法最主要的概念是用已知的案例(case)来预测未来案例的一些属 ...
- sublime text 快速编码技巧 GIT图
网上到处都云云sublime有多好.用了一年多的时间,受益匪浅,减少了很多重复性的劳动. 特别是: 1.灵活强大的多行编辑功能: 2.快速查找文件 ctrl + p; 3.正则查找 + 多行编辑; 4 ...
- bzoj 2144: 跳跳棋——倍增/二分
Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他 ...