只能改成链式前向星解决吗
#include<bits/stdc++.h>
#define v__ v_w.first
#define w__ v_w.second
#define int unsigned int
using namespace std;
const int N=300005;
int n,m;
vector<pair<int,int> > vec[N];
struct Test{
int u,v,cost,lca;
}tests[N];
bool cmp(Test t1,Test t2) {return t1.cost>t2.cost;}
int cost[N],fa[N],siz[N],dep[N],mson[N],top[N],dfn[N];
void dfs1(int u,int father,int now_cost) {
siz[u]=1,fa[u]=father,dep[u]=dep[father]+1,cost[u]=now_cost;
for(auto v_w:vec[u]) {
if(v__==father) continue;
dfs1(v__,u,now_cost+w__);
siz[u]+=siz[v__];
if(siz[v__]>siz[mson[u]]) mson[u]=v__;
}
}
int cnt;
void dfs2(int u,int top_node) {
if(u==0) return;
top[u]=top_node,dfn[u]=++cnt;
dfs2(mson[u],top_node);
for(auto v_w:vec[u]) {
if(v__==fa[u] || v__==mson[u]) continue;
dfs2(v__,v__);
}
}
int get_lca(int u,int v) {
while(top[u]!=top[v]) {
if(dep[top[u]]<dep[top[v]]) swap(u,v);
u=fa[top[u]];
}
if(dep[u]>dep[v]) swap(u,v);
return u;
}
int val[N],delta,maxval;
void dfs3(int u) {
for(auto v_w:vec[u]) {
if(v__==fa[u]) continue;
dfs3(v__);
val[u]+=val[v__];
}
}
void dfs4(int u) {
for(auto v_w:vec[u]) {
if(v__==fa[u]) {
if(val[u]==maxval&&val[v__]==maxval) {
delta=max(delta,w__);
}
continue;
}
dfs4(v__);
}
}
bool check(int want) {
memset(val,0,sizeof(val));
maxval=0;
for(int i=1;i<=m;++i) {
if(tests[i].cost>want) {
val[tests[i].u]++,val[tests[i].v]++;
val[tests[i].lca]--,val[fa[tests[i].lca]]--;
maxval++;
}
}
delta=0;
dfs3(1); //差分
dfs4(1); //获取最大边
if(tests[1].cost-delta<=want) return 1;
return 0;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> m;
int u,v,w;
for(int i=1;i<n;++i) {
cin >> u >> v >> w;
vec[u].push_back(make_pair(v,w));
vec[v].push_back(make_pair(u,w));
}
dfs1(1,0,0);
dfs2(1,1);
for(int i=1;i<=m;++i) {
cin >> u >> v;
tests[i].u=u,tests[i].v=v,tests[i].lca=get_lca(u,v);
tests[i].cost=cost[u]+cost[v]-2*cost[tests[i].lca];
}
sort(tests+1,tests+1+m,cmp);
int l=0,r=tests[1].cost+10,mid,ans=0;
while(l<=r) {
mid=(l+r)>>1;
if(check(mid)) r=mid-1,ans=mid;
else l=mid+1;
}
cout << ans;
return 0;
}