POJ 1984 Navigation Nightmare
并查集,给n个点和m条边,每条边有方向和长度,再给q个询问,第i个询问查询两个点之间在Ti时刻时的曼哈顿距离(能连通则输出曼哈顿距离,否则输出-1)
这题跟Corporative Network 有点像,只不过那题是维护到根节点的距离,这题还要顺便维护与根节点的x,y方向的偏移量。findset时,每次找完father就要加上father的x、y坐标偏移量,这样findset完以后就得到了与根的偏移量。然后合并时, (注意,这里是 fa[x] = y)
dr[x].x = r.x - dr[r.u].x + dr[r.v].x;
dr[x].y = r.y - dr[r.u].y + dr[r.v].y; 即 x->y <==> u->v - u->x + v->y 如下图:

这题还要注意数据可能不是按照时间顺序输入的,要做一个排序,然后再按原来的顺序输出。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 40100 int fa[N],q; struct DR
{
int x,y;
}dr[N],to[]; struct ROAD
{
int u,v;
int x,y;
}road[N]; struct QUERY
{
int a,b,time;
int id,res;
}query[N]; void makeset(int n)
{
for(int i=;i<=n;i++)
{
fa[i] = i;
dr[i].x = dr[i].y = ;
}
} int findset(int x)
{
if(x != fa[x])
{
int tmp = fa[x];
fa[x] = findset(fa[x]);
dr[x].x += dr[tmp].x;
dr[x].y += dr[tmp].y;
}
return fa[x];
} void unionset(int index) //合并第index条边
{
ROAD r = road[index];
int x = findset(r.u);
int y = findset(r.v);
if(x == y)
return;
fa[x] = y;
dr[x].x = r.x - dr[r.u].x + dr[r.v].x; // x->y <==> u->v - u->x + v->y
dr[x].y = r.y - dr[r.u].y + dr[r.v].y;
} int cmp1(QUERY ka,QUERY kb)
{
return ka.time<kb.time;
} int cmp2(QUERY ka,QUERY kb)
{
return ka.id<kb.id;
} void InitDirection()
{
to['E'-'A'].x = ;
to['E'-'A'].y = ;
to['W'-'A'].x = -;
to['W'-'A'].y = ;
to['N'-'A'].x = ;
to['N'-'A'].y = ;
to['S'-'A'].x = ;
to['S'-'A'].y = -;
} void read()
{
int n,m,i,dis;
char ss[];
InitDirection();
scanf("%d%d",&n,&m);
makeset(n);
for(i=;i<=m;i++)
{
scanf("%d%d%d %s",&road[i].u,&road[i].v,&dis,ss);
road[i].x = dis*(to[ss[]-'A'].x);
road[i].y = dis*(to[ss[]-'A'].y);
}
scanf("%d",&q);
for(i=;i<=q;i++)
{
scanf("%d%d%d",&query[i].a,&query[i].b,&query[i].time);
query[i].id = i;
}
sort(query+,query+q+,cmp1);
} void solve()
{
int i,j;
j=;
for(i=;i<=q;i++)
{
for(;j<=query[i].time;j++)
{
unionset(j);
}
if(findset(query[i].a) != findset(query[i].b))
query[i].res = -;
else
query[i].res = abs(dr[query[i].a].x-dr[query[i].b].x) + abs(dr[query[i].a].y-dr[query[i].b].y);
}
sort(query+,query+q+,cmp2);
for(i=;i<=q;i++)
cout<<query[i].res<<endl;
} int main()
{
read();
solve();
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 Navigation Nightmare 带全并查集
Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= ...
- POJ 1984 Navigation Nightmare (数据结构-并检查集合)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 4072 Accepted: 1 ...
- POJ 1984 - Navigation Nightmare - [带权并查集]
题目链接:http://poj.org/problem?id=1984 Time Limit: 2000MS Memory Limit: 30000K Case Time Limit: 1000MS ...
- POJ 1984 Navigation Nightmare(二维带权并查集)
题目链接:http://poj.org/problem?id=1984 题目大意:有n个点,在平面上位于坐标点上,给出m关系F1 F2 L D ,表示点F1往D方向走L距离到点F2,然后给出一系 ...
- poj 1984 Navigation Nightmare(带权并查集+小小的技巧)
题目链接:http://poj.org/problem?id=1984 题意:题目是说给你n个线,并告知其方向,然后对于后面有一些询问,每个询问有一个时间点,要求你输出在该时间点a,b的笛卡尔距离,如 ...
- BZOJ 3362 POJ 1984 Navigation Nightmare 并与正确集中检查
标题效果:一些养殖场是由一些南北或东西向的道路互连. 镶上在不断的过程中会问两个农场是什么曼哈顿的距离,假设现在是不是通信.那么输出-1. 思维:并与正确集中检查,f[i]点i至father[i]距离 ...
- POJ - 1984 Navigation Nightmare 种类并查集
思路:记录每个点与其根结点的横向距离和纵向距离,当知道其父节点与根结点的关系,很容易推出当前节点与根结点的关系: 直接相加即可. int p = a[x].par; a[x].dx += a[p].d ...
- POJ1984 Navigation Nightmare —— 种类并查集
题目链接:http://poj.org/problem?id=1984 Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K T ...
随机推荐
- 【洛谷 P3385】模板-负环(图论--spfa)
题目:有一个图有N个顶点,M条边.边用三个整数a b w表示,意思为a->b有一条权值为w的边(若w<0则为单向,否则双向).共T组数据.对于每组数据,存在负环则输出一行"YE5 ...
- AI - Ideas
Idea: Comprehend code and re-factory code to more readable. The AI program can comprehend source cod ...
- ruby on rails 2.3+的版本不再支持cgi
ruby on rails 2.3+的版本不再支持cgi了,恶心到了,换其他框架,看了款cramp,完全没资料,完全不让人入门 操蛋的厉害,ruby果然是小众的窝里乐,放弃使用
- SQL对字符串数组的处理
一,用临时表作为数组 复制代码代码如下: create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(co ...
- WampServer搭建php环境可能遇到的问题
WampServer搭建php环境可能遇到的问题 1.安装时报错,缺少 MSVCR100.dll 文件 这是因为wampServer安装时用到的vc库没有更新,要安装更新之后再进行安装,因为之前安装的 ...
- 设置ArcGIS的外观改回到出厂
在一般的软件中,都可以在工具-选项中打开相关设置将应用程序的外观改回到出厂.但ArcGIS好像没有,但查帮助文档原来是这样: 配置的更改保存在模板文档中(例如,ArcMap 将其更改保存在 Norma ...
- Android动画translate坐标图
X坐标图示: Y坐标图示:
- IOS SDWebImage实现原理详解
在之前我写过SDWebImage的使用方法,主要是用与获取网络图片,没有看过的朋友可以看看. 这篇文章将主要介绍SDWebImage的实现原理,主要针对于获取网络图片的原理,如果没有第三方我们该怎么去 ...
- windows phone(成语典籍游戏开发)
- [android] 手机卫士保存密码时进行md5加密
一般的手机没有root权限,进不去data/data目录,当手机刷机了后,拥有root权限,就可以进入data/data目录,查看我们保存的密码文件,因此我们需要对存入的密码进行MD5加密 获取Mes ...