题意:有一颗n个结点的带权的无向树, 在s结点放两个机器人, 这两个机器人会把树的每条边都走一遍, 但是最后机器人不要求回到出发点. 问你两个机器人走的路总长之和的最小值是多少?

思路:考虑从一个结点遍历整个树再回到原点需要把每个边计算两遍,这里机器人不用回到出发点,所以两个机器人到达的点越远越好。让两个机器人在初始位置在直径上背道而驰,这样最优解就是所有边*2-直径,因为直径只走了一次,而其他边必走两遍。

可以看看图示:假设每一条边距离为1,明显可以看出,如果机器人都从2出发,那么1机器人走到1,2机器人走到6再回溯到3走到5(如果先走4肯定不是最短),所以3-6边走了两遍,满足sum*2-直径。

#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct Node
{int to,cap;
};
const int N=100010;
vector<Node> v[N];
int vis[N],dis[N],ans;
int bfs(int x)
{memset(dis,0,sizeof(dis));memset(vis,0,sizeof(vis));queue<int> q;q.push(x);vis[x]=1;int point=0;while(!q.empty()){int f=q.front();q.pop();if(dis[f]>ans){ans=dis[f];point=f;}for(int i=0;i<v[f].size();i++){Node temp=v[f][i];if(vis[temp.to]==0){vis[temp.to]=1;dis[temp.to]=dis[f]+temp.cap;q.push(temp.to);}}}return point;
}int main()
{int n,m;while(scanf("%d %d",&n,&m)==2){int sum=0;for(int i=1;i<=n-1;i++){int x,y,z;scanf("%d %d %d",&x,&y,&z);v[x].push_back((Node){y,z});v[y].push_back((Node){x,z});sum+=z;}ans=0;int point=bfs(m);ans=0;bfs(point);printf("%d\n",sum*2-ans);for(int i=1;i<=n;i++) v[i].clear();}
}

转载于:https://www.cnblogs.com/dillydally/p/9567667.html

POJ1849 Two(树的直径)相关推荐

  1. poj1985和poj1849(树的直径)

    题目传送门:poj1985 树是连通无环图,树上任意两点之间的路径是唯一的.定义树上任 意两点u, v的距离为u到v路径上边权的和.树的直径MN为树上最长路 径,即点M和N是树上距离最远的两个点. 题 ...

  2. 「日常训练知识学习」树的直径(POJ-1849,Two)

    题意 一个城市由节点和连接节点的街道组成,街道是双向的. 此刻大雪覆盖了这个城市,市长确定了一些街道要将它们清扫干净,这些街道保证所有的节点可以通过它们连通而且街道数目尽可能小. 现有两台相同的扫雪机 ...

  3. 树的直径/重心 学习笔记

    树的直径 POJ2631 Roads in the North 题意:裸的直径 题解:套模板,但是开始的时候,我的代码在第一次dfs循环的时候,没有考虑到,路长全为0的情况,而用来记录最远点的maxp ...

  4. [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询

    题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1​,r1​][l2​,r2​]从这两个区间中分别选择两个数字,使得这两个点的 ...

  5. 小A与欧拉路(牛客-树的直径)

    题解: 欧拉路:从图中任意一个点开始到图中任意一个点结束的路径,并且图中每条边只通过恰好一次 问你走完这树上所有的点最短路径是什么. 因为树是没有环的,所以你走到叶子结点的时候需要往回走,也就是再走一 ...

  6. luogu P4408 [NOI2003]逃学的小孩(树的直径)

    整理的算法模板合集: ACM模板 看了半天的题原来没有告诉你三个点的坐标,不然直接跑最短路即可.要求最长的时间,所以我们要自己找到三个点,而在树中最长的路径也就是树的直径.那么本题就可以简化为:在一棵 ...

  7. 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

    整理的算法模板合集: ACM模板 目录 一.树的直径 树形DP 两次DFS / BFS(找到直径的两个端点) 二.动态修改树的边权并求每个时刻的直径(线段树) 三.树的重心 一.树的直径 树的直径满足 ...

  8. 【树的直径】解题报告: luogu P3629 [APIO2010]巡逻(树的直径,位运算成对变换,思维)

    题目链接:P3629 [APIO2010]巡逻 首先看题,从1号结点开始,全部遍历并回到1号结点会恰好经过所有的边两次,这样总长度为 2∗(n−1)2*(n-1)2∗(n−1). 那么如果建立一条路以 ...

  9. 0x63.图论 - 树的直径与最近公共祖先

    目录 一.树的直径(Diameter) 1.树形DP求树的直径 2.两次BFS/DFS求树的直径 1.POJ 1985.Cow Marathon(DFS求树的直径模板题) 2.AcWing 350. ...

  10. [Bzoj2282]消防(二分答案+树的直径)

    Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家 ...

最新文章

  1. python投掷骰子实验_Python小程序--模拟掷骰子
  2. 独家 | 人工智能不能忽视符号逻辑以及原因
  3. 裁员、亏损、倒闭,2019 十大 AI 失败案例回顾
  4. 网站付费免费推广你更中意哪一个?
  5. 一次犹豫不决策略选择
  6. Altium Designer -- PCB设置板框
  7. 纯净pe工具_微PE工具箱2.0
  8. FTP Client Setup
  9. 跨多个专业的从业者想转行做单片机怎么办
  10. matlab 增量式,matlab增量式pid仿真
  11. 0 1背包问题(dp)c语言,DP实例之01背包问题C语言实现
  12. 巴斯勒BASLER GIGE相机程序调试报错后需要拔网线
  13. c语言入门if语句(嵌套)
  14. ubuntu14.04安装Y430P-GTX850M的nvidia驱动和cuda-8.0
  15. 涉及的无盘网络技术方面问题的解答(转)
  16. 正则表达式与遇到的问题
  17. python的单行注释以什么开头_python中单行注释以什么开头,
  18. 一款适合IT团队的在线API文档、技术文档工具-showdoc介绍
  19. 软件测试中文电子版姚静_软件测试[(美)ron patton]读书笔记
  20. 20221005CSP-J2/S2模拟赛总结

热门文章

  1. 多因子选股之tushare数据获取
  2. 圣思园——Java SE Lesson 5
  3. python文件操作练习题【学生成绩.txt】
  4. 什么是消息补偿机制?
  5. python列表对应元素相乘_在python中,将两个列表中的每个元素相乘
  6. 用mysql查询所以同学学号_mysql数据库练习查询41题答案
  7. Flutter Container去掉边框
  8. configure: error: no acceptable C compiler found in $PATH 问题解决
  9. python中idxmax_python-熊猫idxmax()在按包含NaN的时间段分组的...
  10. BPSK码元速率与带宽的关系