1 int build(){ // 虚树构建,pi存放关键点
2
3 if(!sz(pi)) return 0;
4 sort(pi.begin(), pi.end(), [](int x, int y){ return dfn[x] < dfn[y]; });
5 // pi.erase(unique(pi.begin(), pi.end()), pi.end()); // 按需去重
6 // for(auto &v : pi) tag[v] = 1; // 按需标记
7 stk[top = 1] = pi[0];
8 for(int i = 1; i < sz(pi); ++i){
9
10 int v = pi[i], lc = lca(stk[top], v);
11 while(dep[lc] < dep[stk[top - 1]]) P[stk[top - 1]].pb(stk[top]), --top;
12 if(lc != stk[top]){
13
14 P[lc].pb(stk[top]), --top;
15 if(lc != stk[top]) stk[++top] = lc;
16 }
17 stk[++top] = v;
18 }
19 while(--top) P[stk[top]].pb(stk[top + 1]);
20 return stk[1];
21 }