#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int maxN=100010;
struct node{
int to,val;
};
vector<node> v[maxN];
int fa[maxN],g[maxN],dp[maxN][2],tmp[maxN],d;
bool cmp(int x,int y){
return x>y;
}
inline void read(int &a){
int w=0,f=1;
char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1;
for(;ch>='0'&&ch<='9';ch=getchar()) w=(w<<3)+(w<<1)+(ch^48);
a=w*f;
}
inline void dfs(int x){
int cnt=0;
for(register int i=0;i<v[x].size();i++){
int y=v[x][i].to;
if(y==fa[x]) continue;
fa[y]=x;
dfs(y);
}
for(register int i=1;tmp[i];i++) tmp[i]=0;
for(register int i=0;i<v[x].size();i++){
int y=v[x][i].to;
if(y==fa[x]) continue;
tmp[++cnt]=dp[y][0]+v[x][i].val;
}
sort(tmp+1,tmp+cnt+1,cmp);
for(register int i=1;i<=g[x]-1+(x==d);i++) dp[x][0]+=tmp[i];
int lw=tmp[g[x]-1+(x==d)];
if(g[x]>=2 || x==d){
dp[x][1]=dp[x][0]-lw;
for(register int i=0;i<v[x].size();i++){
int y=v[x][i].to;
if(y==fa[x]) continue;
int d0=dp[y][0]+v[x][i].val,d1=dp[y][1]+v[x][i].val;
if(d0>=lw) dp[x][1]=max(dp[x][1],dp[x][0]-d0+d1);
else dp[x][1]=max(dp[x][1],dp[x][0]-lw+d1);
}
}
}
int main(){
int n,x,y,w;
read(n);read(d);
for(register int i=1;i<n;i++){
read(x);read(y);read(w);
v[x].push_back(node{y,w});
v[y].push_back(node{x,w});
}
for(register int i=1;i<=n;i++){
read(g[i]);
dp[i][1]=-1e9;
}
dfs(d);
cout<<dp[d][1];
return 0;
}
怀疑是不是卡死循环了,其他数据点都是几十毫秒
显示"Received signal 24: CPU time limit exceeded." 三次访问子节点优化不了了,一次dfs一次统计tmp(在dfs时统计会导致被子节点的tmp覆盖) 还有一次枚举出去的节点的位置