POJ - 1849 Two(树的直径)
题意:
给你N个结点的树,每条边的权值,以及一个起点位置S。 你有两个robot ,可以同时在树上跑。每跑过一条边就要花费一条边权值的油费(要重复i计算)。现在你要把整棵树跑完,问至少要花费多少。
思路:
做这道题的时候想到了之前做过19牛客暑期训练赛的一道题,第四场A-meeting(签到题),两个题都是给一颗树,然后求有关树的最小边权值。我们知道树的直径毫无疑问是最长的,我们既然要求最少花费即是对于长的路径我们要尽可能避免重复去跑。我们知道要遍历一棵树,分枝是会被重复跑而,枝干不会。所以我们选出树的直径作为枝干这样直径就只被跑一遍。重复跑的损失也就最小。
最后即 )ans = 所有边权值的和乘以2(重复跑)- 枝干的权值(没有重复跑)
code: (关于头文件部分,交的POJ 编译不了)然后把万能头换掉就行了,为了美观就用万能头....
#include<bits/stdc++.h> #define ll long long #define accept 0 using namespace std; const int maxm = 1e6+5; const int maxn = 1e5+5; const int inf = 0xffffff; struct edge{int from;int to;int w;int next; }e[maxm]; int far; ll ans;int head[maxn]; int vis[maxn]; int dist[maxn]; int n,m,top;void add(int u,int v,int w){e[top].from = u;e[top].to = v;e[top].w = w;e[top].next = head[u];head[u] = top++; } void spfa(int s){queue<int> q;for(int i = 1; i <= n ; i++)dist[i] = inf;memset(vis,false,sizeof(vis));q.push(s);dist[s] = 0;while(!q.empty()){int u = q.front() ;q.pop();vis[u] = false ;for(int i = head[u] ; ~i ; i = e[i].next){int v = e[i].to;if(dist[v] > dist[u] + e[i].w){dist[v] = dist[u] + e[i].w;if(!vis[v]){vis[v] = true;q.push(v);}}}}ans = 0;for(int i=1;i<=n;i++){if(ans < dist[i]&&dist[i]!=inf){ans = dist[i];far = i;}} }void init(){memset(head,-1,sizeof(head));top =0; } ll sum; int main(){init();sum = 0;scanf("%d %d",&n,&m);for(int i=1;i<n;i++){int u,v,w;scanf("%d %d %d",&u,&v,&w);sum += w;add(u,v,w);add(v,u,w);}int s = m;spfa(s);spfa(far);printf("%lld\n",sum*2-ans);return accept; }
转载于:https://www.cnblogs.com/Tianwell/p/11404938.html
POJ - 1849 Two(树的直径)相关推荐
- POJ 1849 Two(树的直径+思维)
题目链接:http://poj.org/problem?id=1849 题意是有n个点,n-1条边(树形图),在s点放两个机器人,问这两个机器人遍历完所有的点的最少花费(不用回到原点). ...
- poj 1383 Labyrinth 树的直径
题意: 给一个迷宫,其中任意两个可以走的点之间只有一条路,求在这个迷宫里最长能走多远. 分析: 求树的直径,两次dfs即可. 代码: //poj 1383 //sep9 #include <io ...
- poj 1985 Cow Marathon 【树的直径】
求树的直径 /* POJ:1985 Cow Marathon 2014/10/12/21:18 Yougth*/ #include <cstdio> #include <iostre ...
- 【POJ - 3310】Caterpillar(并查集判树+树的直径求树脊椎(bfs记录路径)+dfs判支链)
题干: An undirected graph is called a caterpillar if it is connected, has no cycles, and there is a pa ...
- 【POJ - 2631 】Roads in the North(树的直径)
题干: Building and maintaining roads among communities in the far North is an expensive business. With ...
- C++剑指offer:[POJ]2631 Roads in the North - 用树形DP的方式求出一棵树的直径
前言 此题是道很简单的题(做法不单一,不仅只有树形DP的方法) 做完了这道题才发现此题原来是一道求树的直径的题,也就是求树上两个节点的最大距离. 题目 问题 N(2692): [POJ2631]北极地 ...
- 0x63.图论 - 树的直径与最近公共祖先
目录 一.树的直径(Diameter) 1.树形DP求树的直径 2.两次BFS/DFS求树的直径 1.POJ 1985.Cow Marathon(DFS求树的直径模板题) 2.AcWing 350. ...
- 树的直径,树的最长路dp思想
dp一直弱死了,树型dp很多基本的题都不会,最近在刷树型dp的题,把关于树的最长路的思想总结一下: 树的直径:树中距离最远的两点间的距离. 下面说几道题: hdu 2196:对于树上(双向边)的每一个 ...
- 树的直径,树的重心,树的分冶
主要是利用了反证法: 假设 s-t这条路径为树的直径,或者称为树上的最长路 现有结论,从任意一点u出发搜到的最远的点一定是s.t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两 ...
- [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询
题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1,r1][l2,r2]从这两个区间中分别选择两个数字,使得这两个点的 ...
最新文章
- 2.RabbitMq-持久化
- git没有changId解决方法
- 点击按钮测试用例标题_怎么写测试用例?
- 后台开发技术(1)--概述
- magento php 所需模块,Magento 博客
- oracle 存储过程设置回滚点,(转)oracle 存储过程事宜使用断点回滚 -savepoint
- python画图库哪个好_机器学习基础5--python画图库matplotlib(上)
- Calico数据路径:IP路由和iptables
- 杭电2067小兔的棋盘
- python对象回收_python 引用,拷贝,对象回收,弱引用
- 关于spark写入文件至文件系统并制定文件名之自定义outputFormat
- 阿里云-CentOS7安装Vsftpd
- nema gps数据转换 matlab,NEMA-0183(GPRMC GPGGA)详细解释(GPS模块输出数据的解释)
- arcgis10.2之Maplex(高级标注扩展模块)
- rss阅读器一览导入opml文件
- word小技巧 将图片批量居中
- 微信网页授权接口 对象存储
- python报错 unexpected keyword argument ‘categories‘
- 云服务器哪家比较好呢?
- 别再乱用了,这才是 @Validated 和 @Valid 的真正区别和用法!
热门文章
- 极其简单的 使用IDEA 中 实现springboot 热部署 (spring boot devtools版)
- collections
- easy-mock 官网,最新网址!
- 凯恩帝1000对刀图解_凯恩帝数控机床对刀方法
- 什么是双亲委派机制?
- idea默认编码设置
- 汽车中控屏显示com点android,老车遇上安卓大屏导航中控的坑
- SpringBoot整合DWR-3.0.2-RELEASE版本,以及解决项目在开发环境及其外置Tomcat运行正常,独立JAR形式内置Tomcat运行异常的问题
- 基于redis实现的分布式时间序列存储Roshi
- 除了叫好也应关注GDPR对数字产业的负效应 | 热评