我原先用了book数组来防止重复访问,这个多带参数防止,本质上是一个意思,但为什么要这样?
#include<bits/stdc++.h>
#define int long long
using namespace std;
int to[1000010],head[1000010],len[1000010],nxt[1000010],book[1000010],book2[1000010],cnt,sum=0,dp[1000010];
void add(int u,int v,int w){
to[++cnt]=v;
len[cnt]=w;
nxt[cnt]=head[u];
head[u]=cnt;
}
void dfs(int point,int fa){
for(int i=head[point];i;i=nxt[i]){
int v=to[i];
// if(!book[v]){
if(v!=fa)
book[v]=1;
dfs(v,point);
dp[point]=max(dp[point],dp[v]+len[i]);
}
}
for(int i=head[point];i;i=nxt[i]){
int v=to[i];
// if(!book2[v]){
if(v!=fa)
book2[v]=1;
sum+=dp[point]-dp[v]-len[i];
}
}
}
main(){
int n,s;
cin>>n>>s;
for(int i=1;i<=n-1;i++){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
// cout<<"wcnm";
book[s]=1;
book2[s]=1;
dfs(s);
cout<<sum;
return 0;
}