Navigation Nightmare---poj1984(多关系并查集)
题目链接:http://poj.org/problem?id=1984
给定n个城市,m条边告诉你城市间的相对距离,接下来q组询问,问你在第几条边添加后两城市的距离。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <map>
#include <vector>
using namespace std;
typedef long long LL;
#define PI 4*atan(1.0)
#define N 42000
#define met(a, b) memset(a, b, sizeof(a)) int f[N], rx[N], ry[N], ans[N];
///rx[i]表示i和f[i]的x的偏移量,ry[i]是y的偏移量;
struct node
{
int u, v, d, I, Id;
char dir[];
}a[N], q[N]; int cmp(node p, node q)
{
return p.Id<q.Id;
} int Find(int x)
{
int k = f[x];
if(x!=f[x])
{
f[x] = Find(f[x]);
rx[x] += rx[k];
ry[x] += ry[k];
}
return f[x];
} void Union(int num)
{
int x = a[num].u, y = a[num].v;
char ch = a[num].dir[]; int px = Find(x), py = Find(y); if(px != py)
{
f[px] = py; rx[px] = rx[y] - rx[x];
ry[px] = ry[y] - ry[x]; if(ch == 'E')
rx[px] -= a[num].d ;
if(ch == 'W')
rx[px] += a[num].d;
if(ch == 'N')
ry[px] -= a[num].d;
if(ch == 'S')
ry[px] += a[num].d;
}
}
int main()
{
int n, m, Q;
while(scanf("%d %d", &n, &m)!=EOF)
{
met(a, );met(q, ); met(ans, );
for(int i=; i<=n; i++)
f[i] = i, rx[i] = ry[i] = ; for(int i=; i<=m; i++)
scanf("%d %d %d %s", &a[i].u, &a[i].v, &a[i].d, a[i].dir); scanf("%d", &Q);
for(int i=; i<=Q; i++)
{
scanf("%d %d %d", &q[i].u, &q[i].v, &q[i].I);
q[i].Id = i;
} sort(q+, q+Q+, cmp);///不排序也可以;因为是按I的顺序给的;
for(int pre=, i=; i<=Q; i++)
{
for(int j=pre+; j<=q[i].I; j++)
Union(j); pre = q[i].I;
int u = q[i].u, v = q[i].v; int px = Find(u);
int py = Find(v); if(px != py) ans[q[i].Id] = -;
else ans[q[i].Id] = abs(rx[u]-rx[v]) + abs(ry[u]-ry[v]);
}
for(int i=; i<=Q; i++)
printf("%d\n", ans[i]);
}
return ;
}
Navigation Nightmare---poj1984(多关系并查集)的更多相关文章
- BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集
BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集 Description 农夫约翰有N(2≤N≤40000)个农场,标号1到N,M( ...
- POJ1984:Navigation Nightmare(带权并查集)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 7871 Accepted: 2 ...
- 【POJ 1984】Navigation Nightmare(带权并查集)
Navigation Nightmare Description Farmer John's pastoral neighborhood has N farms (2 <= N <= 40 ...
- poj 1984 Navigation Nightmare(带权并查集+小小的技巧)
题目链接:http://poj.org/problem?id=1984 题意:题目是说给你n个线,并告知其方向,然后对于后面有一些询问,每个询问有一个时间点,要求你输出在该时间点a,b的笛卡尔距离,如 ...
- 又见关系并查集 以POJ 1182 食物链为例
简单的关系并查集一般非常easy依据给出的关系搞出一个有向的环,那么两者之间的关系就变成了两者之间的距离. 对于此题: 若u.v不在一个集合内,则显然此条语句会合法(暂且忽略后两条.下同). 那么将f ...
- poj1984 带权并查集(向量处理)
Navigation Nightmare Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 5939 Accepted: 2 ...
- poj1984 带权并查集
题意:有多个点,在平面上位于坐标点上,给出一些关系,表示某个点在某个点的正东/西/南/北方向多少距离,然后给出一系列询问,表示在第几个关系给出后询问某两点的曼哈顿距离,或者未知则输出-1. 只要在元素 ...
- poj 1182 食物链(关系并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62824 Accepted: 18432 Description ...
- Find them, Catch them(POJ 1703 关系并查集)
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 38668 Accepted: ...
随机推荐
- 最短路径问题-Floyd算法
概念 最短路径也是图的一个应用,即寻找图中某两个顶点的最短路径长度. 实际应用:例如确定某两个城市间的坐火车最短行车路线长度等. Floyd algorithm 中文名就是弗洛伊德算法. 算法思路:用 ...
- 演示-JQuery属性选择器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- linux 访问远程务器代码
比如用SSH 访问远程 登陆名为hadoop 的IP为192.168.1.35的主机,则用ssh hadoop@192.168.1.35,然后依据提示输入密码即可.
- 【python】通过代理安装包
1.安装setuptools 支持 pip install 或easy_install 2.在终端执行 set HTTP_PROXY=http://your.proxy.com:yourPort se ...
- MathType中常见的两种符号的运用
想要让公式编辑得快速又高效,MathType数学公式编辑器这个神助攻是少不了的.MathType是一款专用的数学公式编辑器,用它来编辑公式非常方便实用,并且排版也非常简单.下面介绍两种常见符号的应用. ...
- c#.net常用函数和方法集
1.DateTime 数字型 System.DateTime currentTime=new System.DateTime(); 1.1 取当前年月日时分秒 currentTime=System.D ...
- Invalidate()函数
Invalidate( ) :使整个窗口客户区无效, 并进行更新显示的函数 介绍 void Invalidate( BOOL bErase = TRUE ); 参数: bErase 决定了是否要在WM ...
- 编写高性能的jQuery代码
jQuery Optimization 现在jQuery已经出现在很多项目中,然而许多同学忽略了他的性能问题以及代码质量问题, 下面是我对jQuery的一些性能方面的学习. 选择器 选择器是jQuer ...
- ASP------字符串与HTML格式相互转换
代码: 1.字符串转HTML HttpUtility.HtmlDecode(" is ") 或者 Server.UrlDecode(" is ") 2.HTML ...
- docker学习-运行第一个docker镜像hello world
docker pull [OPTIONS] NAME[:TAG]:从远程仓库拉取一个镜像到本地,NAME是要拉取的镜像的名称,TAG是docker镜像的版本,不指定的话默认是最新版本 docker ...