大体思路和楼上各位差不多,提供一种$O(n \log n)$的懒人写法
#include<bits/stdc++.h>
#define int long long
using namespace std;
int beg[20005],nex[20005],to[20005],d[20005],w[20005],f[20005],ans[20005],n,e,ma;
priority_queue<pair<int,int> >q[20005];
void add(int x,int y,int z){
to[++e]=y;
nex[e]=beg[x];
beg[x]=e;
w[e]=z;
}
void dfs_anyroot(int x,int fa){
q[x].push(make_pair(0,0));
for(int i=beg[x];i;i=nex[i])
if(fa!=to[i]){
int y=to[i];
d[y]=d[x]+w[i];
dfs_anyroot(y,x);
f[x]=max(f[x],f[y]+w[i]);
q[x].push(make_pair(f[y]+w[i],y));
}
}
void dfs(int x,int fa){
for(int i=beg[x];i;i=nex[i])
if(to[i]!=fa){
int y=to[i],qwq,ff=0;
if(q[x].top().second==y)qwq=q[x].top().first,ff=1,q[x].pop();
ans[y]=max(f[y],q[x].top().first+w[i]);
q[y].push(make_pair(q[x].top().first+w[i],x));
if(ff)q[x].push(make_pair(qwq,y));
dfs(y,x);
}
while(!q[x].empty())q[x].pop();
}
signed main(){
while(scanf("%lld",&n)!=EOF){
memset(nex,0,sizeof(nex));
memset(to,0,sizeof(to));
memset(ans,0,sizeof(ans));
memset(f,0,sizeof(f));
memset(beg,0,sizeof(beg));
memset(d,0,sizeof(d));
memset(w,0,sizeof(w));
e=0;
ma=-1;
int x,y,z;
for(int i=2;i<=n;i++){
scanf("%lld%lld",&x,&y);
add(i,x,y);
add(x,i,y);
}
dfs_anyroot(1,0);
ans[1]=f[1];
dfs(1,0);
for(int i=1;i<=n;i++)
printf("%lld\n",ans[i]);
}
return 0;
}
代码码风极其顽劣,思路异常混乱,语言表述能力可能为负数,能够写出这道题实属奇迹,不推荐参考该题解,代码无注释,思路无过程,值得怀疑题目AC方法。总而言之,Dr.冯是个大蔡鸡
ghs,举报了
#代码码风极其顽劣,思路异常混乱,语言表述能力可能为负数,能够写出这道题实属奇迹,不推荐参考该题解,代码无注释,思路无过程,值得怀疑题目AC方法。总而言之,Dr.冯我们%就对了
代码码风极其顽劣,思路异常混乱,语言表述能力可能为负数,能够写出这道题实属奇迹,不推荐参考该题解,代码无注释,思路无过程,值得怀疑题目AC方法。总而言之,Dr.冯我们%就对了
爱了爱了,踩一脚
#一人亿脚,不许多踩
nb tql
tql
点踩就没意思了啵
其实就是通过维护每个点的优先队列来减少代码思维量(
tql