贪心。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 500500 #define maxe 1000500 using namespace std; int n,s,x,y,z,f[maxv],g[maxv],nume=1; long long ans=0; struct edge { int v,w,nxt; }e[maxe]; void addedge(int u,int v,int w) { e[++nume].v=v; e[nume].w=w; e[nume].nxt=g[u]; g[u]=nume; } void dfs(int x,int fath) { for (int i=g[x];i;i=e[i].nxt) { int v=e[i].v; if (v==fath) continue; dfs(v,x);f[x]=max(f[x],f[v]+e[i].w); } for (int i=g[x];i;i=e[i].nxt) { int v=e[i].v; if (v==fath) continue; ans+=f[x]-f[v]-e[i].w; } } int main() { scanf("%d%d",&n,&s); for (int i=1;i<=n-1;i++) { scanf("%d%d%d",&x,&y,&z); addedge(x,y,z);addedge(y,x,z); } dfs(s,0); printf("%lld\n",ans); return 0; }