hdu 2586 How far away ?(LCA转RMQ~)

来源:互联网 发布:windows nginx php 编辑:程序博客网 时间:2024/06/05 09:24

学了两天终于会了在线和离线这两种算法。。。。唉

以下就是我的模板啦,我看到大佬们有些是用前向星加边的,我暑假学了好久都没学懂,,遂放弃,老老实实用vector。。。

#include <math.h>#include <stdio.h>#include <string.h>#include <iostream>#include <vector>using namespace std;const int MAXN = 40005;struct node {    int v, w;    node(int v_, int w_) {        v = v_;        w = w_;    }};vector<node> edge[MAXN];int dp[MAXN << 1]      [30];  // dp[i][j]存储deep数组中下标i开始长度为2^j的子串中最小值的下标int first[MAXN], ver[MAXN << 1], deep[MAXN << 1];int dis[MAXN], ip, indx;void dfs(int u, int fa, int dep) {    first[u] = ++indx;    deep[indx] = dep;    ver[indx] = u;    for (int i = 0; i < (int)edge[u].size(); i++) {        int v = edge[u][i].v;        int w = edge[u][i].w;        if (v == fa) continue;        dis[v] = dis[u] + w;        dfs(v, u, dep + 1);        deep[++indx] = dep;        ver[indx] = u;    }}void ST(int n) {    for (int i = 1; i <= n; i++) dp[i][0] = i;    for (int j = 1; (1 << j) <= n; j++) {        for (int i = 1; i + (1 << j) <= n; i++) {            int x = dp[i][j - 1];            int y = dp[i + (1 << j)][j - 1];            dp[i][j] = deep[x] < deep[y] ? x : y;        }    }}int RMQ(int l, int r) {    int k = (int)log((double)(r - l + 1) / log(2.0));    int a = dp[l][k], b = dp[r - k + 1][k];    return deep[a] < deep[b] ? a : b;}int LCA(int l, int r) {    int x = first[l], y = first[r];    if (x > y) swap(x, y);    return ver[RMQ(x, y)];}int main(void) {    int t, n, m, x, y, z;    scanf("%d", &t);    while (t--) {        memset(dis, 0, sizeof(dis));        scanf("%d%d", &n, &m);        for (int i = 1; i < n; i++) {            scanf("%d%d%d", &x, &y, &z);            edge[x].push_back((node){y, z});            edge[y].push_back((node){x, z});        }        indx = 0;        dis[1] = 0;        dfs(1, -1, 0);        ST(2 * n - 1);        while (m--) {            int x, y;            scanf("%d%d", &x, &y);            int t = LCA(x, y);            printf("%d\n", dis[x] + dis[y] - 2 * dis[t]);        }    }    return 0;}


原创粉丝点击