日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Innumerable Ancestors 尺取 dfs序 lca

發(fā)布時間:2025/3/19 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Innumerable Ancestors 尺取 dfs序 lca 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  • 給一棵樹,m次查詢,每次查詢給兩個集合,從這兩個集合中分別選一個結(jié)點,使得這兩個結(jié)點的lca的深度最大
  • 考慮dfs序為3, 4, 5的三個結(jié)點,3和4的lca深度一定大于等于3和5的lca深度
  • 所以可以將查詢集合按dfs序進(jìn)行排序,然后雙指針,使每一對dfs序接近的結(jié)點都做一次lca,取最深的即可。尺取的思想。
#include <iostream> #include <cstring> #include <vector> #include <algorithm>using namespace std;const int N = 1e5 + 10;int n, m; vector<int> G[N]; int dep[N], id[N], fa[N], tot; int up[N][21]; int s1[N], s2[N];void dfs(int from, int x) {id[x] = tot ++ ;fa[x] = from;dep[x] = dep[from] + 1;for (int i = 0; i < (int)G[x].size(); i ++ )if (from != G[x][i])dfs(x, G[x][i]);return ; }void init() {for (int i = 1; i <= n; i ++ ) // 先跳0層up[i][0] = fa[i];for (int k = 1; k <= 20; k ++ ) // [1, 20]for (int i = 1; i <= n; i ++ )up[i][k] = up[up[i][k - 1]][k - 1];return ; }bool cmp(int u, int v) {return id[u] < id[v]; }int lca(int a, int b) {if (dep[a] < dep[b]) swap(a, b);for (int k = 20; k >= 0; k -- ) // [20, 1]if (dep[up[a][k]] >= dep[b])a = up[a][k];if (a == b) return a;for (int k = 20; k >= 0; k -- ) // [20, 1]if (up[a][k] != up[b][k]){a = up[a][k];b = up[b][k];}return up[a][0]; }int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);while (cin >> n >> m){for (int i = 1; i <= n; i ++ ) G[i].clear(); // 清空tot = 0; // 清空for (int i = 0; i < n - 1; i ++ ){int u, v;cin >> u >> v;G[u].push_back(v), G[v].push_back(u);}dfs(0, 1); // dfs序,深度,父節(jié)點init(); // 發(fā)展up數(shù)組while (m -- ){int k1, k2;cin >> k1;for (int i = 0; i < k1; i ++ ) cin >> s1[i];cin >> k2;for (int i = 0; i < k2; i ++ ) cin >> s2[i];sort(s1, s1 + k1, cmp); // 按dfs序排序sort(s2, s2 + k2, cmp);int i = 0, j = 0, ans = 0;while (i < k1 && j < k2){ans = max(ans, dep[lca(s1[i], s2[j])]); // 注意的深度depif (id[s1[i]] > id[s2[j]]) j ++ ;else i ++ ;// 如果第一個集合的點的dfs序大于第二個中的dfs序,則選第二個中的dfs序更大}cout << ans << endl;}}return 0; } 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Innumerable Ancestors 尺取 dfs序 lca的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。