博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
noip模拟赛 游
阅读量:5108 次
发布时间:2019-06-13

本文共 1313 字,大约阅读时间需要 4 分钟。

【问题背景】

zhx 和他的妹子出去玩。
【问题描述】
zhx 和他的妹子去一个国家旅游,共有 N 个旅游景点, N-1 条双向连接的道
路将它们联通起来, 每一条道路有固定长度。 一开始 zhx 位于 1 号景点。
现在希望你能够求出旅行长度最小的方案, 使得每个景点至少被访问到一次。
【输入格式】
第一行两个整数 N, 代表景点数目。
接下来 N-1 行, 每行三个整数 s, t, w, 表示有一条从 s t 的双向道路, 长
度为 ws t 的编号从 1 开始。
【输出格式】
一行一个整数, 代表能够访问每个景点至少一次的方案的最小旅行长度。

【样例输入】

3
1 2 3
2 3 3
【样例输出】
6
【样例输入】
3
1 2 3
1 3 3
【样例输出】
9

分析:如果要回到原点,那么树上的每条边都至少要走两次.如果不需要回到原点,那么就停留在离根节点最远的点不回来就好了,ans = 边权和*2-最远距离.

#include 
#include
#include
#include
#include
using namespace std;const int maxn = 100010;int head[maxn], to[maxn], nextt[maxn], w[maxn], tot = 1, n, sum,maxx;void add(int x, int y, int z){ w[tot] = z; to[tot] = y; nextt[tot] = head[x]; head[x] = tot++;}void dfs(int u, int from, int dist){ maxx = max(dist, maxx); for (int i = head[u]; i; i = nextt[i]) { int v = to[i]; if (v == from) continue; dfs(v, u, dist + w[i]); }}int main(){ scanf("%d", &n); for (int i = 1; i <= n - 1; i++) { int s, t, w; scanf("%d%d%d", &s, &t, &w); sum += 2 * w; add(s, t, w); add(t, s, w); } dfs(1, 0,0); printf("%d\n", sum - maxx); return 0;}

 

转载于:https://www.cnblogs.com/zbtrs/p/7735119.html

你可能感兴趣的文章
DataGridView的行的字体颜色变化
查看>>
Java再学习——关于ConcurrentHashMap
查看>>
如何处理Win10电脑黑屏后出现代码0xc0000225的错误?
查看>>
局域网内手机访问电脑网站注意几点
查看>>
c++ STL
查看>>
json数据在前端(javascript)和后端(php)转换
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Groovy中那些神奇注解之ToString
查看>>
Day19内容回顾
查看>>
第七次作业
查看>>
MySql update inner join!MySql跨表更新 多表update sql语句?如何将select出来的部分数据update到另一个表里面?...
查看>>
SpringBoot项目打包
查看>>
JSP的3种方式实现radio ,checkBox,select的默认选择值
查看>>
Linux操作系统 和 Windows操作系统 的区别
查看>>
《QQ欢乐斗地主》山寨版
查看>>
文件流的使用以及序列化和反序列化的方法使用
查看>>
Android-多线程AsyncTask
查看>>
第一个Spring冲刺周期团队进展报告
查看>>
C++函数基础知识
查看>>
红黑树 c++ 实现
查看>>