树上启发式合并模板

树上启发式合并模板

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+5;

vector<int> e[maxn];
int n;
int L[maxn],R[maxn],dfn[maxn],node[maxn],cur,big[maxn],sz[maxn];
int ans[maxn];

void dfs1(int now,int lst) {
    L[now]=dfn[now]=++cur;
    node[cur]=now;
    sz[now]=1;
    for (int nxt:e[now]) if (lst!=nxt) {
            dfs1(nxt,now);
            sz[now]+=sz[nxt];
            if (!big[now]||sz[big[now]]<sz[nxt]) big[now]=nxt;
        }
    R[now]=cur;
}


void add(int x) {
    // 添加节点x的信息到全局数据结构
}

void del(int x) {
    // 从全局数据结构中删除节点x的信息
}

void update_ans(int now) {
    // 更新当前节点的答案
}

void dfs2(int now,int lst,int S) {
    
    for (int nxt:e[now]) {
        if (nxt==lst||nxt==big[now]) continue;
        dfs2(nxt,now,0);
        ans[now]=max(ans[now],ans[nxt]);
    }
    
    if (big[now]) {
        dfs2(big[now],now,1);
        ans[now]=max(ans[now],ans[big[now]]);
    }
    
    add(now);
    
    for (int nxt:e[now]) {
        if (nxt==lst||nxt==big[now]) continue;
        for (int i=L[nxt];i<=R[nxt];i++) {
            add(node[i]);
        }
    }
    
    update_ans(now);
    
    if (!S) for (int i=L[now];i<=R[now];i++)
            del(node[i]);
}


void solve() {

    cin>>n;
    for (int i=1;i<n;i++) {
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    dfs1(1,0);

    dfs2(1,0,0);
}

int main() {
    ios::sync_with_stdio(0);
    int t=1;
//    cin>>t;
    while (t--) solve();
}
posted @ 2026-06-14 18:39  acceptedK77  阅读(8)  评论(0)    收藏  举报