大臣的旅费(求树的最远点对,即树的直径)
来源:互联网 发布:象过河软件视频 编辑:程序博客网 时间:2024/05/19 22:25
题目大意:求树上两点的最远距离。
分析:可以用DP解,也可以用两次DFS。这里我用两次DFS,树上最远的点对一定是树的直径,而且树上其他点到树的直径某一端点肯定是最远的,第一遍搜找到直径的某个端点,第二次就可以找出来树的直径了,然后就找到了最远的点对啦。关键在于,理解树上任意一点搜一次的最远点一定在直径的某个端点上。
Code:
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 100000;struct node{int next;int to;int w;}edge[maxn];int n, cnt, x, maxx;int head[maxn];bool vis[maxn];void dfs(int a, int sum) {if(maxx < sum) {maxx = sum;x = a;}for(int i = head[a]; ~i; i = edge[i].next) {int t = edge[i].to;if(!vis[t]) {vis[t] = true;dfs(t, sum+edge[i].w);vis[t] = false;}}}int main() {while(~scanf("%d", &n)) {memset(head, -1, sizeof(head));for(int i = 0; i < n-1; i++) {int a, b, c;scanf("%d%d%d", &a, &b, &c);edge[i].to = b-1;edge[i].next = head[a-1];edge[i].w = c;head[a-1] = i;edge[n-1+i].to = a-1;edge[n-1+i].next = head[b-1];edge[n-1+i].w = c;head[b-1] = n-1+i;}x = maxx = 0;memset(vis, 0, sizeof(vis));vis[0] = true;dfs(0, 0);vis[0] = false;memset(vis, 0, sizeof(vis));vis[x] = true;dfs(x, 0);printf("%d\n", maxx*(11+10+maxx)/2);}return 0;}
0 0
- 大臣的旅费(求树的最远点对,即树的直径)
- 蓝桥杯 大臣的旅费 (求树的直径)
- 大臣的旅费 两遍dfs求树的直径
- 大臣的旅费(树的直径)
- 大臣的旅费____树的直径
- 蓝桥杯-- 历届试题 大臣的旅费(树的直径)
- (水)大臣的旅费 蓝桥杯 树的直径
- 大臣的旅费(DFS 树的直径)
- 蓝桥杯 大臣的旅费 (树的直径)
- 蓝桥杯 大臣的旅费(树的直径 dijkstra,dfs)
- 大臣的旅费 (求树的直径,2个dfs)
- 蓝桥杯 大臣的旅费 By Assassin 树的最大直径
- 蓝桥杯——大臣的旅费(树的最大直径)
- 蓝桥杯 历届试题 大臣的旅费 (树的直径 BFS)
- 树的直径 —— 即一棵树的最长路 附题(大臣的旅费 by蓝桥杯)
- 大臣的旅费(DFS)
- 大臣的旅费
- 大臣的旅费
- TuShare(2):使用TuShare,抓取股票数据并存储到数据库
- 不改变正负数相对顺序,重排数组,使负数在正数之前
- Java NIO系列教程(十) Java NIO DatagramChannel
- Android中Bitmap,byte[],Drawable,InputStream相互转化工具类
- Android 手机摇晃监听
- 大臣的旅费(求树的最远点对,即树的直径)
- 从零开始写Http框架---第四篇
- PAT (Advanced Level) Practise 1053 Path of Equal Weight (30)
- Activiti - 设置会签
- SSH中 整合spring和proxool 连接池
- AngularJS基本功能
- Hadoop关于处理大量小文件的问题和解决方法
- soledede--隐马尔可夫模型(HMM)-信道模型
- unity文本自发光效果