T1 树学
题目
【问题描述】
给定一颗 n 个点的树,树边带权,试求一个排列 P,最大化下式
其中,calc(a, b)表示树上由a到b经过的最大边权。
【输入格式】
第一行一个整数 n,表示点数下接 n − 1 行,每行三个数 u, v, w 表示一条连接点 u 和点 v 权值为 w
【输出格式】
总共一行一个整数,表示答案
【输入样例】
2
1 2 2333
【输出样例】
2333
【数据范围】
对于前5%的数据满足 n ≤ 8
对于前40%的数据满足 n ≤ 20
对于前60%的数据满足 n ≤ 200
对于100%的数据满足 n ≤ 100
解析
先从边权最小的边开始累加,尽可能的减少当前边的贡献次数。发现每轮最少贡献一次,即将边两侧的点在P中完全分开。
试过多组数据之后,不难发现,答案即为所有边权之和。
1、最长边只计算过一次。
2、如果次长边被经过两次及以上,从次长边的一端出发,到了最长边的一端,走了一个来回,很显然,这是错误的,所以,次长边只计算过一次。
3、以此类推,最后,所有边都只计算过一次。
Code
#include <iostream> #include <cstdio> using namespace std; int n,u,v,w; long long ans; int main() { cin>>n; for(int i=1;i<n;i++) { cin>>u>>v>>w; ans+=w; } cout<<ans; return 0; }