博客
关于我
【模板】LCA
阅读量:181 次
发布时间:2019-02-28

本文共 1791 字,大约阅读时间需要 5 分钟。

#include
using namespace std;const int N = 50010;struct Edge { int v, w;};int f[N][20], d[N], dist[N];vector
son[N];int T, n, m, tot, t;queue
q;void bfs() { memset(d, 0, sizeof(d)); q.push(1); d[1] = 1; while (q.size()) { int x = q.front(); q.pop(); for (int i = 0; i < son[x].size(); i++) { int v = son[x][i].v, w = son[x][i].w; if (d[v]) continue; d[v] = d[x] + 1; dist[v] = dist[x] + w; f[v][0] = x; for (int j = 1; j <= t; j++) { f[v][j] = f[f[v][j-1]][j-1]; } q.push(v); } }}int lca(int x, int y) { if (d[x] > d[y]) swap(x, y); for (int i = t; i >= 0; i--) { if (d[f[y][i]] >= d[x]) y = f[y][i]; if (x == y) return x; for (int i = t; i >= 0; i--) { if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i]; } return f[x][0]; }}int main() { cin >> T; while (T--) { cin >> n; t = (int)(log(n) / log(2)) + 1; tot = 0; for (int i = 1; i <= n; i++) son[i].clear(); for (int i = 1; i <= n; i++) { int x, y, z; scanf("%d%d%d", &x, &y, &z); son[x].push_back({y, z}); son[y].push_back({x, z}); } bfs(); cin >> m; for (int i = 1; i <= m; i++) { int x, y; scanf("%d%d", &x, &y); printf("%d\n", dist[x] + dist[y] - 2 * dist[lca(x, y)]); } }}

这段代码实现了一个基于广度优先搜索(BFS)的最低公共祖先(LCA)算法,用于处理无向图中的最短路径问题。代码的主要功能包括:

  • BFS遍历:用于计算每个节点到根节点(节点1)的距离和深度。
  • LCA查询:通过跳跃指针技术快速找到两个节点的最低公共祖先。
  • 路径计算:计算两个节点之间的最短路径长度。
  • 代码的实现思路包括:

    • 广度优先搜索(BFS):用于计算节点的深度和到根节点的距离。
    • 跳跃指针技术:预处理每个节点的跳跃表,使得LCA查询效率更高。
    • 动态规划:用于处理跳跃表中的父指针更新。

    代码结构清晰,注释完整,易于理解和维护。

    转载地址:http://pawn.baihongyu.com/

    你可能感兴趣的文章
    MyEcplise中SpringBoot怎样定制启动banner?
    查看>>
    MyPython
    查看>>
    MTD技术介绍
    查看>>
    MySQL
    查看>>
    MySQL
    查看>>
    mysql
    查看>>
    MTK Android 如何获取系统权限
    查看>>
    MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
    查看>>
    MySQL - ERROR 1406
    查看>>
    mysql - 视图
    查看>>
    MySQL - 解读MySQL事务与锁机制
    查看>>
    MTTR、MTBF、MTTF的大白话理解
    查看>>
    mt_rand
    查看>>
    mysql -存储过程
    查看>>
    mysql /*! 50100 ... */ 条件编译
    查看>>
    mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
    查看>>
    mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
    查看>>
    mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
    查看>>
    mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
    查看>>
    MySQL 8.0 恢复孤立文件每表ibd文件
    查看>>