N coding

3176_도로네트워크 본문

PS

3176_도로네트워크

NYWOO19 2018. 9. 21. 20:35
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
#define inf 10000000
 
int n, a, b, c, k, d, e;
int mx = 0, mn = inf;
int par[100001][21], maxx[100001][21], minn[100001][21];
int visit[100001], dep[100001];
vector<vector<pair<intint>>> adj;
 
void dfs(int cur, int d) {
    visit[cur] = 1;
    dep[cur] = d;
 
    for (auto i : adj[cur]) {
        if (!visit[i.first]) {
            par[i.first][0= cur;
            maxx[i.first][0= i.second;
            minn[i.first][0= i.second;
            dfs(i.first, d + 1);
        }
    }
}
 
void func(int n) {
    for (int j = 1; j < 21; j++) {
        for (int i = 1; i <= n; i++) {
            par[i][j] = par[par[i][j - 1]][j - 1];
            if (maxx[par[i][j - 1]][j - 1]) {
                maxx[i][j] = max(maxx[i][j - 1], maxx[par[i][j - 1]][j - 1]);
            }
            if (minn[par[i][j - 1]][j - 1]) {
                minn[i][j] = min(minn[i][j - 1], minn[par[i][j - 1]][j - 1]);
            }
        }
    }
}
 
 
int largest(int a, int b, int c) {
    int ret = a;
    ret > b ? ret : ret = b;
    ret > c ? ret : ret = c;
    return ret;
}
 
int smallest(int a, int b, int c) {
    int ret = a;
    ret < b ? ret : ret = b;
    ret < c ? ret : ret = c;
    return ret;
}
 
void lca(int x, int y) {
    if (dep[x] > dep[y]) swap(x, y);
 
    for (int i = 20; i >= 0; i--) {
        if (dep[y] - dep[x] >= (1 << i)) {
            mx = max(mx, maxx[y][i]);
            mn = min(mn, minn[y][i]);
            y = par[y][i];
        }
    }
 
    if (x == y) {
        return;
    }
 
    for (int i = 20; i >= 0; i--) {
        if (par[x][i] != par[y][i]) {
            mx = largest(mx, maxx[x][i], maxx[y][i]);
            mn = smallest(mn, minn[y][i], minn[x][i]);
            x = par[x][i];
            y = par[y][i];
        }
    }
 
    mx = largest(mx, maxx[x][0], maxx[y][0]);
    mn = smallest(mn, minn[y][0], minn[x][0]);
 
}
 
int main() {
    scanf("%d"&n);
    adj.resize(n + 1);
 
    for (int i = 0; i < n - 1; i++) {
        scanf("%d %d %d"&a, &b, &c);
        adj[a].push_back({ b, c });
        adj[b].push_back({ a, c });
    }
 
    dfs(10);
    func(n);
 
    scanf("%d"&k);
    while (k--) {
        scanf("%d %d"&d, &e);
        mx = 0; mn = inf;
        lca(d, e);
 
        printf("%d %d\n", mn, mx);
    }
 
}
 
cs



딱 1년정도 전쯤에 풀었던 lca 문제이다.

이땐 이것도 길다고 찡찡댔는데 지금은..

'PS' 카테고리의 다른 글

5922_above the median  (0) 2020.06.26
2472_체인점  (0) 2018.09.22
5480_전함  (0) 2018.09.21
[Atcoder] ARC 102D - All Your Paths are Different Lengths  (2) 2018.09.13
1575_졸업  (0) 2018.09.07