Poj-1330-Nearest Common Ancestors-倍增LCA

来源:互联网 发布:excel办公软件 编辑:程序博客网 时间:2024/05/29 11:04

代码很好理解(我觉得是)好吧,这么渣的代码根本就是我自己写的(ノ=Д=)ノ┻━┻

LCA倍增代码

#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <vector>#include <queue>#include <algorithm> #define maxn 10010#define lg 20#define inf 0xefffffff using namespace std; vector<int> g[maxn];int f[maxn][lg + 5], d[maxn], n; void dfs(int x){    d[x] = d[f[x][0]] + 1;    for (int i = 1; i <= lg; i++)        f[x][i] = f[f[x][i - 1]][i - 1];    for (int i = 0; i < g[x].size(); i++)        dfs(g[x][i]);    return ;} inline void init(){    scanf("%d", &n);    for (int i = 0; i < maxn; i++)        g[i].clear();    memset(f,0,sizeof(f));    memset(d,0,sizeof(d));    int fr, to;    for (int i = 1; i < n; i++)    {        scanf("%d %d", &fr, &to);        g[fr].push_back(to);        f[to][0] = fr;    }    for (int i = 1; i <= n; i++)        if (!f[i][0])        {            dfs(i);            break;        }    return ;} inline int lca(int x, int y){    if (d[x] < d[y])        swap(x, y);    int dt = d[x] - d[y];    for (int i = lg; i >= 0; i--)        if ((1 << i) & dt)            x = f[x][i];    if (x == y)        return x;    for (int i = lg; i >= 0; i--)        if (f[x][i] != f[y][i])            x = f[x][i], y = f[y][i];    return f[x][0];} int main(){    int T;    scanf("%d", &T);    int fr, to;    while (T--)    {        init();        scanf("%d %d", &fr, &to);        printf("%d\n", lca(fr, to));    }    return 0;}


0 0
原创粉丝点击