POJ 1849 Two(遍历树)
POJ 1849 Two(遍历树)
http://poj.org/problem?id=1849
题意:
有一颗n个结点的带权的无向树, 在s结点放两个机器人, 这两个机器人会把树的每条边都走一遍, 可是最后机器人不要求回到出发点. 问你两个机器人走的路总长之和的最小值是多少?
分析:
首先本题仅仅要求出树的直径, 然后用树的总长sum*2-树的直径就是所求结果.
以下一步步来说明为什么是这种.
1.如果仅仅有1个机器人遍历树,且要求回到原点,
它最少须要走多少路?
答: 它须要走树总长sum的两倍, 即每条树边它都要走两次才行. 这个结论画个图就明确了, 对于每条边, 机器人要走过该边, 之后还要从该边回去(不回来就不能回到出发点了). 所以自然是sum*2.
2.如果1问中的机器人遍历树,可是不要求它回到原点,
那么它最少须要走多少路?
答: 最少须要走sum-[从出发点能走到最远的点的距离]. 在行走的过程中每一个分叉, 它走过去,又走回来就可以. 能够反证得出.
3.如果有两个机器人从s出发,遍历整个树且终于回到出发点.
它们行走的最短距离是?
答: 树总长的两倍. 每一个机器人都必须回到原点, 那么必定每条边至少要被走两次.
4.如果有两个机器人从s出发,遍历整个树且它们不须要回到出发点.
它们行走的最短距离是?
答: 树总长的两倍-树的直径. 机器人出去不回来,则所走路径中有一条简单路径是能够仅仅走一遍的,派出了两个点去遍历,也就是说有两条简单路径是能够直走一边的,我们要使这两条简单路径的总和尽可能的长,就转换为了树的最长路径问题了.
注意:上面第4种情况, 两个机器人从哪点出发都是没有不论什么差别的. 由于假设它们出发点不在树的直径上, 那么它们一定能够一起移动到树直径上的某个点上,然后分别朝树直径的两个方向走, 而且遍历它们走的树直径的全部分叉路两次.
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=100000+5; //边结构
struct Edge
{
Edge(){}
Edge(int to,int cost,int next):to(to),cost(cost),next(next){}
int to;
int cost;
int next;
}edges[maxn];
int cnt=0;//总边数
int head[maxn]; //加入两条有向边
void AddEdge(int u,int v,int cost)
{
edges[cnt]=Edge(v,cost,head[u]);
head[u]=cnt++;
edges[cnt]=Edge(u,cost,head[v]);
head[v]=cnt++;
} int dist[maxn]; //返回从s能到达的最长点编号
int BFS(int s)
{
int max_dist=0;
int id=s;
queue<int> Q;
memset(dist,-1,sizeof(dist));
dist[s]=0;
Q.push(s); while(!Q.empty())
{
int u=Q.front(); Q.pop();
if(dist[u]>max_dist)
max_dist=dist[id=u]; for(int i=head[u]; i!=-1; i=edges[i].next)
{
Edge &e=edges[i];
if(dist[e.to]==-1)
{
dist[e.to]=dist[u]+e.cost;
Q.push(e.to);
}
}
}
return id;
} int main()
{
int n,s;
while(scanf("%d%d",&n,&s)==2)
{
int sum=0;//树的总长
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1;i<=n-1;i++)
{
int u,v,cost;
scanf("%d%d%d",&u,&v,&cost);
sum+=cost;
AddEdge(u,v,cost);
} printf("%d\n",sum*2-dist[BFS(BFS(s))]);
}
return 0;
}
POJ 1849 Two(遍历树)的更多相关文章
- POJ 1985 Cow Marathon && POJ 1849 Two(树的直径)
树的直径:树上的最长简单路径. 求解的方法是bfs或者dfs.先找任意一点,bfs或者dfs找出离他最远的那个点,那么这个点一定是该树直径的一个端点,记录下该端点,继续bfs或者dfs出来离他最远的一 ...
- lintcode :前序遍历和中序遍历树构造二叉树
解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...
- lintcode: 中序遍历和后序遍历树构造二叉树
题目 中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 / \ 1 3 注意 你可 ...
- java遍历树(深度遍历和广度遍历
java遍历树如现有以下一颗树:A B B1 B11 B2 B22 C C ...
- poj 1849 Two
/*poj 1849 two 思考一下会发现 就是求直径 直径上的中点就是两个人分开的地方(不再有交集)*/ #include<cstdio> #define maxn 100010 us ...
- POJ 2155 D区段树
POJ 2155 D区段树 思考:D区段树是每个节点设置一个段树树. 刚開始由于题目是求A[I,J],然后在y查询那直接ans^=Map[i][j]的时候没看懂.后面自己把图画出来了才理解. 由于仅 ...
- POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)
POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...
- LintCode-72.中序遍历和后序遍历树构造二叉树
中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 注意事项 你可以假设树中不存在相同数值的节点 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: ...
- LintCode-73.前序遍历和中序遍历树构造二叉树
前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: ...
随机推荐
- 高仿人人网客户端Android版项目源码
高仿人人网客户端,有兴趣的盆友可以研究下,里面主要包含的一些UI设计与交互.(注:项目中有少许问题,apk能运行,希望开发者可以参考代码研究一下.) 源码下载:http://code.662p.com ...
- 5-Java-C(位平方和)
题目描述: 把一个整数的每个数位都平方后求和,又得到一个整数,我们称这个整数为:位平方和. 对新得到的整数仍然可以继续这一运算过程. 比如,给定整数为4,则一系列的运算结果为: 16,37,58,89 ...
- badblocks - 查询设备的坏区块
语法(SYNPSIS) badblocks [ -svwnf ] [ -b block-size ] [ -c blocks_at_once ] [ -i input_file ] [ -o outp ...
- url编码函数encodeURI和encodeURIComponent
var url = "http://www.wrox.com/illegal value.html#start";encodeURIComponent(url) //" ...
- h5移动端常见虚拟键盘顶起底部导航栏解决办法
在h5移动端开发中相信很多朋友跟我一样都会遇到页面底部导航被虚拟键盘顶起的问题,自己在网上找到的解决办法拿出来与大家分享,有不完美之处还望见谅,有更好的解决办法可以贴出来大家一起互相学习!! var ...
- Python re模块 subprocess模块
re模块 内部实现不是Python 而是调用了c的库 re是什么 正则 表达 式子 就是一些带有特殊含义的符号或者符号的组合作用: 对字符串进行过滤 在一对字符串中找到所关心的内容 你就需要告诉计算机 ...
- Centos6.5下 执行“ll”提示“-bash: ll: command not found”
ll 是 ls -l的别名,之所所以 ll出现错误是因为没有定义别名. 如果要实现ll 命令,可以做如下操作: 编辑 ~./bashrc 添加 ls -l 的别名为 ll即可 [root@Centos ...
- xtrbackup备份mysql
mysqldump备份方式是采用逻辑备份,但是它最大的缺陷就是备份和恢复速度慢对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了. x ...
- 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
如何优雅的使用vue+Dcloud(Hbuild)开发混合app 最近在做混合app,前端框架用的是vue,打包app使用的是Dcloud,不过在开发过程中有一点不爽的是,如果想使用Dcloud提供的 ...
- PHP:POST OR GET 请求
文章来源:http://www.cnblogs.com/hello-tl/p/7685216.html /** * 模拟提交参数,支持https提交 可用于各类api请求 * @param strin ...