N coding
3176_도로네트워크 본문
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<int, int>>> 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(1, 0); 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 |