POJ1984 Navigation Nightmare —— 种类并查集
题目链接:http://poj.org/problem?id=1984
Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 7136 | Accepted: 2556 | |
Case Time Limit: 1000MS |
Description
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 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
![](/assets/blank.gif)
![](/assets/blank.gif)
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 —— 种类并查集相关推荐
- Poj(1703),种类并查集
题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...
- BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...
- poj 1703(种类并查集)
题目大意:在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 输入D x y代表x于y不在一个团伙里 输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里 解 ...
- Find them, Catch them POJ - 1703(种类并查集)
题意: 在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 1.输入D x y代表x于y不在一个团伙里 2.输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙 ...
- 2016陕西省ACM 热身体B 种类并查集
Energy 发布时间: 2017年3月27日 11:31 最后更新: 2017年3月27日 18:30 时间限制: 1000ms 内存限制: 256M 描述 人类准备发射载人飞船前往火星 ...
- Mahmoud and a Dictionary CodeForces - 766D 种类并查集
题意 给出多个字符串 然后再输入多个字符串之间的关系 让我们判断这其中是否存在矛盾的关系 有矛盾输出NO 没矛盾输出 YES 然后再输入多个询问 每个询问 两个字符串 让我们判断其中的关系 同义词输出 ...
- POJ 1703 Find them, Catch them 种类并查集
题意 给出一堆点和关系 D为两点不同集合 A为查询两点是否不同集合 n<=1e5 code #include<cstdio> #include<iostream> #in ...
- 【POJ - 1703】Find them, Catch them(带权并查集之--种类并查集 权为与父节点关系)
题干: Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 36176 Accep ...
- POJ1182 食物链---(经典种类并查集)
题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
最新文章
- Laravel和Thinkphp有什么区别,哪个框架好用
- 亿级PV,常见性能优化策略总结与真实案例
- GridView和DetailsView在同一页与不同页两种情况的联动
- linux C 中的volatile使用
- man、info、help
- Angular 学习笔记——service constant
- PCA与LDA算法的解释,浅显易懂
- 数据结构和算法 —— 绪论
- 安卓进阶系列-02搜索框(PersistentSearch)的使用
- Go 使用 JSON
- Android P(3)---Android P版本刘海屏适配指南
- yum安装jdk1.8
- windows下文件系统格式介绍
- Android ActionBar示例教程
- .ipynb文件的使用问题
- 软件测试的艺术读书笔记
- 生物信息学数据库导航
- python范围缩放_如何缩放到初始绘图/缩放的特定范围?
- 谷歌大脑组合模型霸榜 SuperGLUE,什么模型这么高?
- 茶叶文化网站设计与实现 HTML+CSS学生网页设计作业源码