Изменения

Перейти к: навигация, поиск

Алгоритм Тарьяна поиска LCA за О(1) в оффлайне

920 байт добавлено, 20:54, 4 июня 2014
Нет описания правки
Нетрудно заметить что ответ для lca(v,u) = ancestor(find(u)).Так же можно понять что для каждого запроса это условие(что одна вершина уже посещена, а другую мы обрабатываем) выполнится только один раз.
== Псевдокод Реализация == vector<codebool>Для всехvisited; vector</code> <tex>u \in V</texint>query[n];  int dsu_get (int v) { return v == dsu[v] ? v : dsu[v] = dsu_get (dsu[v]);}  void unite (int a, int b,int new_ancestor) { a = dsu_get (a); b = dsu_get (b); dsu[a] = b; ancestor[b] = new_ancestor;} <tex>d void dfs(int v) { visited[v] = true; for (u таких, что (v, u] \gets \infty</tex>) — ребро в G) <tex>d if (!visited[su] \gets 0\</tex><br>) <tex> U \gets \emptyset</tex><br> dfs(u);<code>Пока</code> <tex>\exists union(v,u,v \notin U</tex>);: for (i = 0; i <code>Пусть</code> <tex>query[v \notin U : d].size(); i++) if (visited[query[v][i]]) cout </tex> <code> минимальный "LCA " </code>: <code>Для всехv </code> <tex>u \notin U" " </tex> <code>таких, чтоu </code> <tex>vu \in E" = " </tex>:: <code>если</code> <tex> dancestor[dsu_get(q[uv] > d[vi])] + w; } int main(vu)</tex> <code>то</code>::: <tex>d[u] \gets d[v] + w { dfs(vu0)</tex>; return 0;: <tex>U \gets v </tex>} == Оценка сложности ==Она состоит из нескольких оценок.Во-первых dfs работает О(n).Во-вторых, операции по объединению множеств, которые в сумме для всех разумных n затрачивают O(n) операций. В-третьих, для каждого запроса проверка условия и определение результата, опять же, для всех разумных n выполняется за O(1). Итоговая асимптотика получается O(n+m), но при достаточно больших m ответ за O(1) на один запрос.
Анонимный участник

Навигация