poj1985和poj1849(树的直径)
题目传送门:poj1985
树是连通无环图,树上任意两点之间的路径是唯一的。定义树上任 意两点u, v的距离为u到v路径上边权的和。树的直径MN为树上最长路 径,即点M和N是树上距离最远的两个点。
题目就是寻找树的直径的版子题,两次dfs(第一次遍历根节点所到达的最远距离x点,第二次dfs从x到达最远距离y,这个就是树的直径),或者树形dp,我这里用到了树形dp;
还要感谢石神对我的教导和更正,让我接触了树形dp;
但这个题的代码就不给出了,因为在下面一题的代码中会体现。。
题目:poj1849
所以这里我不仅给出题目的答案,我们也来讨论一下每一种情况;
假设只有1个机器人遍历树,且要求回到原点, 它最少需要走多少路?
2 × ∑wi。
若不用回到原点?
2 × ∑wi−(从出发点所能到达的最远距离)。即 沿着最远距离走,过程中每个分叉走两遍。
假设只有2个机器人遍历树,且要求回到原点, 它最少需要走多少 路?
2 ×∑wi。
若不用回到原点?
2 ×∑wi−(树的直径)。
这个题就是最后一种情况,
分析:考虑从一个结点遍历整个树再回到原点需要把每个边计算两遍,这 里机器人不用回到出发点,所以两个机器人到达的点越远越好。 要使路程最近,若起点在树的直径上,则两辆车往不同的方向走, 直径上的边只用走一遍,其他的要走两遍。 若起点不在直径上,则两人一起走到直径上,再往不同的方向走。 这样最优解就是所有边×2−直径,因为直径只走了一次,而其他边 必走两遍。
#include<algorithm>
#include<bitset>
#include<cctype>
#include<cerrno>
#include<clocale>
#include<cmath>
#include<complex>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<limits>
#include<list>
#include<map>
#include<iomanip>
#include<ios>
#include<iosfwd>
#include<iostream>
#include<istream>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<streambuf>
#include<string>
#include<utility>
#include<vector>
#include<cwchar>
#include<cwctype>
using namespace std;
const int maxn=4e4+;
template<typename T>inline void read(T &x)
{
x=;
T f=,ch=getchar();
while (!isdigit(ch) && ch^'-') ch=getchar();
if (ch=='-') f=-, ch=getchar();
while (isdigit(ch)) x=(x<<)+(x<<)+(ch^), ch=getchar();
x*=f;
}
int n,m,a,b,c,point,tot,ans,sum;
int dis[],vis[],lin[];
struct gg {
int y,next,v;
}an[];
void add(int x,int y,int z) {
an[++tot].y=y;
an[tot].v=z;
an[tot].next=lin[x];
lin[x]=tot;
}
inline int dp(int x)
{
vis[x]=;
for(int i=lin[x];i;i=an[i].next)
{
int y=an[i].y;
if(vis[y]) continue;
dp(y);
ans=max(ans,dis[x]+dis[y]+an[i].v);
dis[x]=max(dis[x],dis[y]+an[i].v);
}
return ans;
}
int main()
{
int sum=;
read(n);read(m);
for(int i=;i<n;i++)
{
read(a),read(b),read(c);
add(a,b,c);
add(b,a,c);
sum+=c;
}
dp();
printf("%d\n",(sum<<)-ans);
return ;
}
poj1985和poj1849(树的直径)的更多相关文章
- poj1985 / poj2631(树的直径)
poj1985 Cow Marathon 树的直径裸题 树的直径的一般求法: 任意一点为起点,dfs/bfs找出与它最远的点$u$ 以$u$为起点,dfs/bfs找出与它最远的点$v$ 则$d(u,v ...
- 「日常训练&知识学习」树的直径(POJ-1849,Two)
题意 一个城市由节点和连接节点的街道组成,街道是双向的. 此刻大雪覆盖了这个城市,市长确定了一些街道要将它们清扫干净,这些街道保证所有的节点可以通过它们连通而且街道数目尽可能小. 现有两台相同的扫雪机 ...
- poj1985 Cow Marathon (求树的直径)
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 3195 Accepted: 1596 Case ...
- [USACO2004][poj1985]Cow Marathon(2次bfs求树的直径)
http://poj.org/problem?id=1985 题意:就是给你一颗树,求树的直径(即问哪两点之间的距离最长) 分析: 1.树形dp:只要考虑根节点和子节点的关系就可以了 2.两次bfs: ...
- poj1849(求树的直径)
题目链接:http://poj.org/problem?id=1849 题意:有一颗n个结点的带权的无向树, 在s结点放两个机器人, 这两个机器人会把树的每条边都走一遍, 但是最后机器人不要求回到出发 ...
- poj1985&&第四次CCF软件认证第4题 求树的直径
Cow Marathon Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 4216 Accepted: 2137 Case ...
- [POJ1985] Cow Marathon 「树的直径」
>传送门< 题意:求树的直径 思路:就是道模板题,两遍dfs就求出来了 Code #include <cstdio> #include <iostream> #in ...
- D4 树的直径、重心以及基环树
第一题第二题鉴上我前几篇博客poj1985 poj1849:https://www.cnblogs.com/Tyouchie/p/10384379.html 第三题:数的重心:poj1655 来自sj ...
- POJ 树的直径和重心
树的直径:(无根)树上最长两点间的最长路径,两次dfs即可,第一次dfs任选一点u,找到距离它最远的点s,再从点s进行一次dfs,找到距离s最远的点t,则s-t之间的路径就是树的直径.证明: < ...
随机推荐
- [ICPC 北京 2017 J题]HihoCoder 1636 Pangu and Stones
#1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...
- [Golang] 编译程序时打上git提交信息标记
1.加入代码 //version.go package version import ( "flag" "fmt" "os" ) var ( ...
- 管理菜单 结贴回复 来自 202.112.36.253 的回复: TTL 传输中过期
发表于 2010-08-26 18:29:14 楼主 其实标题是我执行如下命令时的输出:C:\Users\ChenWeiguang>ping 218.198.81.190 正在 Ping 218 ...
- Codeforces Round #498 (Div. 3)
被虐惨了,实验室里数十位大佬中的一位闲来无事切题(二,然后出了5t,当然我要是状态正常也能出5,主要是又热又有蚊子什么的... 题都挺水的.包括F题. A: 略 B: 找k个最大的数存一下下标然后找段 ...
- yarn卸载或增加节点
yarn卸载或增加节点 卸载节点或者增加节点: 方式一:静态的增添删除:将集群关闭,修改配置文件(etc/hadoop/slaves),重新启动集群(很黄很暴力,不够人性化). 方式二:动态的增加 ...
- vue中嵌套页面 iframe 标签
vue中嵌套iframe,将要嵌套的文件放在static下面: <iframe src="../../../static/bear.html" width="300 ...
- python特殊函数__str__、__repr__和__len__
1.__str__ 首先介绍__str__ class Students(object): def __init__(self, *args): self.names = args # def __s ...
- js运用3
1. js的本质就是处理数据.数据来自于后台的数据库. 所以变量就起到一个临时存储数据的作用. ecmascript制定了js的数据类型. 数据类型有哪些? 1. 字符串 string 2. 数字 n ...
- 手把手教你提交文件到git
手把手教你使用git提交到github 作者 数据分析与优化 关注 2016.07.17 10:25 字数 7342 阅读 399评论 1喜欢 6 摘要Git是分布式版本控制系统,那么它就没有中央服务 ...
- Alpine Linux常用命令
一:Alpine Linux开启SSH远程登陆 1.简介: 最重要的一个服务了,远程登陆需要用它,文件传输需要用它,必备功能.不管你是在实体机上跑,虚拟机上跑,docker里面跑,这个都是必须的. 2 ...