标签:std ble 离线 ber points check 表示 lan hide
F1 --- (13) ---- F6 --- (9) ----- F3
| |
(3) |
| (7)
F4 --- (20) -------- F2 |
| |
(2) F5
|
F7
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
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 using namespace std;
5 const int N = 4e4+5;
6 struct link{
7 int x, y, dis;
8 char dir;
9 }l[N];
10 int f[N], rela[N][2], n, m, k; //[0]代表横向,[1]代表竖向
11
12 void init();
13 int find(int x);
14 void merge(int x, int y, int dis, char dir);
15 bool check(int x, int y);
16
17 int main()
18 {
19 scanf("%d %d", &n, &m);
20 init();
21 for (int i=1;i<=m;i++)
22 scanf("%d %d %d %c", &l[i].x, &l[i].y, &l[i].dis, &l[i].dir);
23 scanf("%d", &k);
24 int cnt = 1;
25 for (int i=1;i<=k;i++)
26 {
27 int a, b, num;
28 scanf("%d%d%d", &a, &b, &num);
29 while (cnt <= num)
30 {
31 merge(l[cnt].x, l[cnt].y, l[cnt].dis, l[cnt].dir);
32 cnt++;
33 }
34 if (check(a, b))
35 printf("%d\n", abs(rela[a][0] - rela[b][0]) + abs(rela[a][1] - rela[b][1]));
36 else
37 printf("-1\n");
38 }
39 return 0;
40 }
41
42 void init()
43 {
44 for (int i=1;i<=n;i++)
45 f[i] = i, rela[i][0] = rela[i][1] = 0;
46 }
47 int find(int x)
48 {
49 if (f[x] == x) return x;
50 int temp = f[x];
51 f[x] = find(f[x]);
52 rela[x][0] = rela[temp][0] + rela[x][0];
53 rela[x][1] = rela[temp][1] + rela[x][1];
54 return f[x];
55 }
56 void merge(int x, int y, int dis, char dir)
57 {
58 int fx = find(x), fy = find(y);
59 if (fx != fy)
60 {
61 int dx = 0, dy = 0;
62 f[fy] = fx;
63 if (dir == ‘E‘)
64 dy -= dis;
65 else if (dir == ‘W‘)
66 dy += dis;
67 else if (dir == ‘N‘)
68 dx -= dis;
69 else if (dir == ‘S‘)
70 dx += dis;
71 dx -= rela[y][1], dy -= rela[y][0];
72 dx += rela[x][1], dy += rela[x][0];
73 rela[fy][0] = dy, rela[fy][1] = dx;
74 }
75 }
76 bool check(int x, int y)
77 {
78 return find(x) == find(y);
79 }
Navigation Nightmare POJ - 1984 (带权并查集)
标签:std ble 离线 ber points check 表示 lan hide
原文地址:https://www.cnblogs.com/FantaDevourer/p/12795064.html