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 个关系中都是代表这两只虫能够交配, 就是默认异性, 问你在给出的关系中有没有与异性交配这一事实相反的, 即同性之间给出了交配 ...
随机推荐
- 直通BAT面试算法精讲课2
对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] clas ...
- spring全局异常处理 自定义返回数据结构
在写api接口中,正常返回和异常错误返回我们都希望很清楚的将这些信息清楚的返回给用户,出现异常情况下需要清楚的知道是参数异常还是未知异常,而不是返回一个不正确的数据结构. 所以此处只针对写api接口时 ...
- 开发系统级应用不被Kill
一.设置方法 (1) 在AndroidManifest中application根节点下,添加如下代码: android:persistent="true" (2) 将应用程序pus ...
- Getting Private/Public IP address of EC2 instance using AWS-cli [closed]
For private IP address: aws ec2 describe-instances --instance-ids i-b78a096f | grep PrivateIpAddress ...
- 关于android中PendingIntent.getBroadcase的注册广播
使用语句 PendingIntent intent= PendingIntent.getBroadcast(Context context, int requestCode, Intent inten ...
- Java集合(3)一 红黑树、TreeMap与TreeSet(上)
目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) Java集合(4)一 红黑树. ...
- jquery checkbox选中状态以及实现全选反选
jquery1.6以下版本获取checkbox的选中状态: $('.ck').attr('checked'); $('.ck').attr('checked',true);//全选 $('.ck'). ...
- debussy与modelsim的联调设置
前段时间看到网上有人在使用debussy软件对Verilog代码进行调试,而且都称赞其是多么的好用,看着很是馋人,说吧,现在用的是quartus与modelsim的联调,似乎还是可以的,但就是每次稍微 ...
- 小程序_RSA加密功能
这是开发的第三个小程序,基于一个物流系统,简化功能开发下单流程.登录的时候,系统是使用RSA进行加解密的. 流程:第一个接口获取到后端传过来的密匙共钥(publicKey),通过公钥使用RSA加密密码 ...
- 《Applying Deep Learning to Answer Selection: A Study And an Open Task》文章理解小结
本篇论文是2015年的IBM watson团队的. 论文地址: 这是一篇关于QA问题的一篇论文: 相关论文讲解1.https://www.jianshu.com/p/48024e9f7bb22.htt ...