题目链接:http://poj.org/problem?id=1984

Navigation Nightmare
Time Limit: 2000MS   Memory Limit: 30000K
Total Submissions: 7136   Accepted: 2556
Case Time Limit: 1000MS

Description

Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1..N. A series of M (1 <= M < 40,000) vertical and horizontal roads each of varying lengths (1 <= length <= 1000) connect the farms. A map of these farms might look something like the illustration below in which farms are labeled F1..F7 for clarity and lengths between connected farms are shown as (n):

           F1 --- (13) ---- F6 --- (9) ----- F3
            |                                 |
           (3)                                |
            |                                (7)
           F4 --- (20) -------- F2            |
            |                                 |
           (2)                               F5
            |
           F7 

Being an ASCII diagram, it is not precisely to scale, of course.

Each farm can connect directly to at most four other farms via roads that lead exactly north, south, east, and/or west. Moreover, farms are only located at the endpoints of roads, and some farm can be found at every endpoint of every road. No two roads cross, and precisely one path 
(sequence of roads) links every pair of farms.

FJ lost his paper copy of the farm map and he wants to reconstruct it from backup information on his computer. This data contains lines like the following, one for every road:

There is a road of length 10 running north from Farm #23 to Farm #17 
There is a road of length 7 running east from Farm #1 to Farm #17 
...

As FJ is retrieving this data, he is occasionally interrupted by questions such as the following that he receives from his navigationally-challenged neighbor, farmer Bob:

What is the Manhattan distance between farms #1 and #23?

FJ answers Bob, when he can (sometimes he doesn't yet have enough data yet). In the example above, the answer would be 17, since Bob wants to know the "Manhattan" distance between the pair of farms. 
The Manhattan distance between two points (x1,y1) and (x2,y2) is just |x1-x2| + |y1-y2| (which is the distance a taxicab in a large city must travel over city streets in a perfect grid to connect two x,y points).

When Bob asks about a particular pair of farms, FJ might not yet have enough information to deduce the distance between them; in this case, FJ apologizes profusely and replies with "-1".

Input

* Line 1: Two space-separated integers: N and M

* Lines 2..M+1: Each line contains four space-separated entities, F1,
        F2, L, and D that describe a road. F1 and F2 are numbers of
        two farms connected by a road, L is its length, and D is a
        character that is either 'N', 'E', 'S', or 'W' giving the
        direction of the road from F1 to F2.

* Line M+2: A single integer, K (1 <= K <= 10,000), the number of FB's
        queries

* Lines M+3..M+K+2: Each line corresponds to a query from Farmer Bob
        and contains three space-separated integers: F1, F2, and I. F1
        and F2 are numbers of the two farms in the query and I is the
        index (1 <= I <= M) in the data after which Bob asks the
        query. Data index 1 is on line 2 of the input data, and so on.

Output

* Lines 1..K: One integer per line, the response to each of Bob's
        queries.  Each line should contain either a distance
        measurement or -1, if it is impossible to determine the
        appropriate distance.

Sample Input

7 6
1 6 13 E
6 3 9 E
3 5 7 S
4 1 3 N
2 4 20 W
4 7 2 S
3
1 6 1
1 4 3
2 6 6

Sample Output

13
-1
10

Hint

At time 1, FJ knows the distance between 1 and 6 is 13. 
At time 3, the distance between 1 and 4 is still unknown. 
At the end, location 6 is 3 units west and 7 north of 2, so the distance is 10. 

Source

USACO 2004 February
题解:
1.由于查询操作还限定了查询时的下标,即可以查询中间状态。所以需要离线处理。
2.普通的种类并查集。只是当前结点与父节点的的相对关系有两个:相对x和相对y。
代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <queue>
 8 #include <stack>
 9 #include <map>
10 #include <string>
11 #include <set>
12 #define ms(a,b) memset((a),(b),sizeof((a)))
13 using namespace std;
14 typedef long long LL;
15 const double EPS = 1e-8;
16 const int INF = 2e9;
17 const LL LNF = 2e18;
18 const int MAXN = 1e5+10;
19
20 int n, m, k;
21 int fa[MAXN], r[MAXN][2];   //r[i][0]、r[i][1]分别代表点i的相对横纵坐标
22
23 struct  //保存边的信息
24 {
25     int u, v, w;
26     char dir[2];
27 }a[MAXN];
28
29 struct node     //保存查询信息
30 {
31     int u, v, index, id;    //index为查询的下标; id为此查询输入时的下标,用于输出答案
32     bool operator<(const node& x)const {    //按查询的下标从小到大排列
33         return index<x.index;
34     }
35 }q[MAXN];
36 int ans[MAXN]; //离线操作之保存答案
37
38 int find(int x)
39 {
40     if(fa[x]==-1) return x;
41     int pre = find(fa[x]);
42     r[x][0] += r[fa[x]][0]; //累积相对横坐标
43     r[x][1] += r[fa[x]][1]; //累积相对纵坐标
44     return fa[x] = pre;
45 }
46
47 int Union(int u, int v, int w, char dir)    //当dir为0时, 代表着查询
48 {
49     //以下为v相对于u的位置
50     int xx = 0, yy = 0;
51     if(dir=='E') xx = w; if(dir=='W') xx = -w;
52     if(dir=='N') yy = w; if(dir=='S') yy = -w;
53
54     int fu = find(u);
55     int fv = find(v);
56     if(fu==fv)
57         return abs(r[u][0]-r[v][0]) + abs(r[u][1]-r[v][1]);
58     if(dir==0) return -1;   //如果是查询操作,并且两者不在同一集合,则直接返回-1;
59
60     fa[fv] = fu;
61     r[fv][0] = -r[v][0]+xx+r[u][0];
62     r[fv][1] = -r[v][1]+yy+r[u][1];
63     return -1;
64 }
65
66 int main()
67 {
68     scanf("%d%d", &n, &m);
69     memset(fa, -1, sizeof(fa));
70     memset(r, 0, sizeof(0));
71
72     for(int i = 1; i<=m; i++)
73         scanf("%d%d%d%s", &a[i].u, &a[i].v, &a[i].w, a[i].dir);
74
75     scanf("%d", &k);
76     for(int i = 1; i<=k; i++)
77         scanf("%d%d%d", &q[i].u, &q[i].v, &q[i].index), q[i].id = i;
78     sort(q+1, q+1+k);   //对查询进行排序
79
80     int t = 1;
81     for(int i = 1; i<=m; i++)
82     {
83         Union(a[i].u, a[i].v, a[i].w, a[i].dir[0]); //合并u 、v
84         while(q[t].index==i)    // 是 while 不是 if !!因为有可能多个询问都在同一个下标。
85         {
86             ans[q[t].id] = Union(q[t].u, q[t].v, 0, 0);
87             if(++t>k) break;
88         }
89     }
90
91     for(int i = 1; i<=k; i++)
92         printf("%d\n", ans[i]);
93 }

View Code

转载于:https://www.cnblogs.com/DOLFAMINGO/p/7661612.html

POJ1984 Navigation Nightmare —— 种类并查集相关推荐

  1. Poj(1703),种类并查集

    题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...

  2. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

    题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...

  3. poj 1703(种类并查集)

    题目大意:在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 输入D x y代表x于y不在一个团伙里 输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里 解 ...

  4. Find them, Catch them POJ - 1703(种类并查集)

    题意: 在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 1.输入D x y代表x于y不在一个团伙里 2.输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙 ...

  5. 2016陕西省ACM 热身体B 种类并查集

    Energy 发布时间: 2017年3月27日 11:31   最后更新: 2017年3月27日 18:30   时间限制: 1000ms   内存限制: 256M 描述 人类准备发射载人飞船前往火星 ...

  6. Mahmoud and a Dictionary CodeForces - 766D 种类并查集

    题意 给出多个字符串 然后再输入多个字符串之间的关系 让我们判断这其中是否存在矛盾的关系 有矛盾输出NO 没矛盾输出 YES 然后再输入多个询问 每个询问 两个字符串 让我们判断其中的关系 同义词输出 ...

  7. POJ 1703 Find them, Catch them 种类并查集

    题意 给出一堆点和关系 D为两点不同集合 A为查询两点是否不同集合 n<=1e5 code #include<cstdio> #include<iostream> #in ...

  8. 【POJ - 1703】Find them, Catch them(带权并查集之--种类并查集 权为与父节点关系)

    题干: Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36176   Accep ...

  9. POJ1182 食物链---(经典种类并查集)

    题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

最新文章

  1. Laravel和Thinkphp有什么区别,哪个框架好用
  2. 亿级PV,常见性能优化策略总结与真实案例
  3. GridView和DetailsView在同一页与不同页两种情况的联动
  4. linux C 中的volatile使用
  5. man、info、help
  6. Angular 学习笔记——service constant
  7. PCA与LDA算法的解释,浅显易懂
  8. 数据结构和算法 —— 绪论
  9. 安卓进阶系列-02搜索框(PersistentSearch)的使用
  10. Go 使用 JSON
  11. Android P(3)---Android P版本刘海屏适配指南
  12. yum安装jdk1.8
  13. windows下文件系统格式介绍
  14. Android ActionBar示例教程
  15. .ipynb文件的使用问题
  16. 软件测试的艺术读书笔记
  17. 生物信息学数据库导航
  18. python范围缩放_如何缩放到初始绘图/缩放的特定范围?
  19. 谷歌大脑组合模型霸榜 SuperGLUE,什么模型这么高?
  20. 茶叶文化网站设计与实现 HTML+CSS学生网页设计作业源码

热门文章

  1. 桌面每日一句--桌面翻译工具(有道翻译,微软翻译,Google翻译)
  2. IOS 图片点击放大不失真
  3. Java语言基础:注释
  4. WEB综合案例 黑马面面 day04 用户与角色绑定功能 登录用户菜单控制和权限效验
  5. VUE 前端中如何进行组件化开发?
  6. excel表格下拉选项怎么设置_让表格美观好看几个Excel设置技巧
  7. commvault 配置mysql_Commvault_Oracle DG恢复到单机操作手册
  8. 卡尔曼滤波之目标跟踪
  9. 树莓派Bullseye系统安装QT
  10. 未动科技与地平线达成战略合作,共推全场景智能驾驶加速落地