Files
2026-06-03 09:36:52 +09:00

40 lines
1.1 KiB
C++

BOJ 1
1 i c: i번 c로 .
2 u v: u에서 v로 .
vi adj[N]; int par[N]; int sz[N]; int d[N];
void dfs1(int s) {
sz[s] = 1;
for(auto it=adj[s].begin(); it!=adj[s].end(); it++)
if(*it == par[s]) {adj[s].erase(it); break;}
for(auto &i : adj[s]) {
par[i] = s; d[i] = d[s] + 1;
dfs1(i); sz[s] += sz[i];
if(sz[i] > sz[adj[s][0]]) swap(adj[s][0], i);
}
}
int in[N], c; int top[N];
void dfs2(int s) {
in[s] = ++c;
for(auto i : adj[s]) {
if(i == adj[s].front()) top[i] = top[s];
else top[i] = i;
dfs2(i);
}
}
int query(int a,int b) {
int ans = 0;
while(top[a] != top[b]) {
if(d[top[a]] > d[top[b]]) swap(a, b);
ans = max(ans, query(root, in[top[b]], in[b]));
b = par[top[b]];
}
if(d[a] > d[b]) swap(a, b);
return max(ans, query(root, in[a]+1, in[b]));
}
// dfs1(1); dfs2(1);
// forr(i, n) arr[in[i]] = m[{par[i], i}]; init(root, arr);
// q == 1: update(root, in[a], c); // in[a]를 c로 대체
// q == 2: query(a, b);