宜中資訊
CP
Ccucumber12
2021.08.09
\(x\) in \(\delta(S,T)\)
\(x\) not in \(\delta(S,T)\)
for farthest point \(z\) in 1. DFS, discuss two situations:
\(\delta(x,z)\) cross \(\delta(S,T)\) at \(y\)
\(\delta(x,z)\) not cross \(\delta(S,T)\)
#include <bits/stdc++.h> using namespace std ; vector<int> g[100010] ; int lev[100010], tar ; void dfs(int x, int p) { lev[x] = lev[p] + 1 ; if(lev[x] > lev[tar]) tar = x ; for(auto i:g[x]) if(i != p) dfs(i, x) ; } int main() { int n; // input g for(int i=1; i<=n; ++i) lev[i] = 0 ; dfs(1, 0) ; for(int i=1; i<=n; ++i) lev[i] = 0 ; int S = tar ; dfs(S, 0) ; int T = tar ; cout << S << ' ' << T << endl ; }
vector<int> g[100010] ; int sz[100010], n; vector<int> cen ; void dfs(int x, int p) { sz[x] = 1 ; int ret = 0 ; for(auto i:g[x]) if(i != p) { dfs(i, x) ; sz[x] += sz[i] ; ret = max(ret, sz[i]) ; } ret = max(ret, n - sz[x]) ; if(ret * 2 <= n) cen.push_back(x) ; }
vector<int> g[100010] ; vector<int> et ; int in[100010], out[100010] ; void dfs(int x, int p) { et.push_back(x) ; in[x] = et.size() - 1 ; for(auto i:g[x]) if(i != p) { dfs(i, x) ; et.push_back(x) ; } out[x] = et.size() - 1 ; }
vector<int> g[100010] ; int lca[30][100010] ; int lev[100010] ; void dfs(int x, int p) { lca[0][x] = p ; lev[x] = lev[p] + 1 ; for(auto i:g[x]) if(i != p) dfs(i, x) ; } void build(int n) { for(int i=1; i<=log2(n); ++i) for(int j=1; j<=n; ++j) lca[i][j] = lca[i-1][lca[i-1][j]] ; } int query(int a, int b) { if(lev[a] < lev[b]) swap(a, b) ; for(int i=25; i>=0; --i) if(lev[lca[i][a]] >= lev[b]) a = lca[i][a] ; if(a == b) return a ; for(int i=25; i>=0; --i) { if(lca[i][a] != lca[i][b]) { a = lca[i][a] ; b = lca[i][b] ; } } return lca[0][a] ; }
const int MXN = 200000; const int N = MXN + 10; struct info{ int w; int dep, pa, size, next; int id, root; // id on data structure } inf[N]; vec<int> g[N]; int prepare(int v, int pa, int d=0){ // find : dep, pa, size, next int maxsub = 0; inf[v].pa = pa; inf[v].dep = d; inf[v].size = 1; inf[v].next = -1; for(auto i:g[v]){ if(i == pa) continue; int sub = prepare(i, v, d+1); inf[v].size += sub; if(sub > maxsub) { maxsub = sub; inf[v].next = i; } } return inf[v].size; } int cntID = 1; void mapTo(int v, int pa, int root){ // map : id, root inf[v].id = cntID++; inf[v].root = root; modify(inf[v].id, inf[v].w); if(inf[v].next != -1) mapTo(inf[v].next, v, root); for(auto i:g[v]){ if(i == pa) continue; if(i == inf[v].next) continue; mapTo(i, v, i); } } void update(int x, int v){ inf[x].w = v; modify(inf[x].id, inf[x].w); } int query(int s, int t){ int ans = 0; while(inf[s].root != inf[t].root){ if(inf[inf[s].root].dep < inf[inf[t].root].dep) swap(s, t); amax(ans, DSquery(inf[s].id, inf[inf[s].root].id)); s = inf[inf[s].root].pa; } amax(ans, DSquery(inf[s].id, inf[t].id)); return ans; }