Description
Input
Output
僅包含一個整數V,爲小Q最少使用的道具次數
Sample Input
1
1 2 1
1 3 3
Sample Output
題解:
繼續樹形dp,只需要在更新答案的時候加上邊權的就好了。具體不會推的話可以參見hzwer的博客。
還是那句話。。注意開long long
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=2000001;
struct xx
{
int from,to,nxt,w;
}e[MAXN<<1];
int head[MAXN<<1],cnt,n,m;
int father[MAXN<<1];
int dp[MAXN];
long long ans;
inline void add(int x,int y,int z)
{
cnt++;
e[cnt].from=x;
e[cnt].to=y;
e[cnt].w=z;
e[cnt].nxt=head[x];
head[x]=cnt;
}
void build(int x)
{
int i,t;
for(i=head[x];i;i=e[i].nxt)
{
t=e[i].to;
if(t==father[x]) continue;
father[t]=x;
build(t);
dp[x]=max(dp[x],dp[t]+e[i].w);
}
for(i=head[x];i;i=e[i].nxt)
if(e[i].to==father[x]) continue;
else ans+=dp[x]-dp[e[i].to]-e[i].w;
}
int main(int argc, char *argv[])
{
int i,j,x,y,z,m;
scanf("%d%d",&n,&m);
for(i=1;i<n;i++)
scanf("%d%d%d",&x,&y,&z),add(x,y,z),add(y,x,z);
build(m);
printf("%lld\n",ans);
return 0;
}