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之间的路径就是树的直径.证明: < ...
随机推荐
- tomcat启动出错 invalid LOC header
tomcat启动出错 invalid LOC header,run as maven test 没有报错,只有警告: 'build.plugins.plugin.version' for org.ap ...
- poj 1269
水题.判断两条直线位置关系. 考虑平行的情况,那么 四边形的面积会相等,重合的话,四边形的面积相等且为0. 除去这两种就一定有交点. #include <cstdio> #include ...
- web开发中xml的内容
文档声明(注:文档声明前不能有注释) XML中的元素/标签 注:xmlx中解析程序会将其中的空格与换行当做内容来解析,区分大小写 CDATA区域中的内容不解析
- jq 监听调整浏览器窗口的大小
<html><head><script type="text/javascript" src="http://www.w3school.co ...
- Oracle课程档案,第十二天
死锁是由于两个对象在拥有一份资源的情况下申请另一份资源, 而另一份资源恰好又是这两对象正持有的,导致两对象无法完成操作,且所持资源无法释放. 阻塞是由于资源不足引起的排队等待现象. unso:撤销 c ...
- Python学习之旅(三十五)
Python基础知识(34):电子邮件(Ⅰ) 几乎所有的编程语言都支持发送和接收电子邮件 在使用Python收发邮件前,请先准备好至少两个电子邮件,如xxx@163.com,xxx@sina.com, ...
- phpspider php爬虫框架
其实我自身的不是经常写正则,而且不规则的html去写正则本身就是件很麻烦的事情,如果页面有些微变动和更新就得再次去维护正则表达式,其实是非常蛋疼的 我第一感觉就是去找一下爬虫的库,但是发现现在php爬 ...
- C/S和B/S的应用的区别
C/S: C是指Client,S是指Server.C/S模式就是指客户端/服务器模式.通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销. ...
- 转:sql篇 select from where group by having order by
原文地址: sql篇 select from where group by having order by select from where group by having order by 的基 ...
- delphi操作sqlite3
Delphi SQLite 简明无废话上手指南SQLite下载http://www.sqlite.org/download.html SQLite FAQhttp://www.sqlitecn.org ...