检查站点
如果1有多个子节点的话,我们下山之后一定会要上山,但是最后一次下山不需要上山、所以我们这里让最后一次下山的权值最大即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<climits>
#include<string>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
#define rep(i,j,k)for(i=j;i<k;i++)
#define per(i,j,k)for(i=j;i>k;i--)
#define MS(x,y)memset(x,y,sizeof(x))
typedef long long LL;
const int INF =0x7FFFFFFF;
const int M=1e5+1;
int pre[M],sum[M];
int i,j,k,n,m,t;
int num ,maxn;
int f(int x)
{
if(x!=pre[x]){
int t=pre[x];
pre[x]=f(pre[x]);
sum[x]+=sum[t];
}
return pre[x];
}
int main()
{
while(~scanf("%d",&n))
{
num=0;
rep(i,0,n+1)
pre[i]=i;
MS(sum,0);
rep(i,1,n){
int x,y,d;
scanf("%d %d %d",&x,&y,&d);
int fx=f(x),fy=f(y);
if(fy!=fx){
pre[fy]=fx;
sum[fy]=d+sum[x];
}
num+=d;
}
sort(sum,sum+n+1);
printf("%d\n",num-sum[n]);
}
return 0;
}
注:sort排序区间[a,b).