博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[洛谷P3174][HAOI2009]毛毛虫
阅读量:6768 次
发布时间:2019-06-26

本文共 1243 字,大约阅读时间需要 4 分钟。

题目大意:给一棵树,求其中最大的“毛毛虫”,毛毛虫的定义是一条链上分出几条边

题解:把每个点的权值定义为它的度数减一,跑带权直径即可,最后答案加二

卡点:

 

C++ Code:

#include 
#include
namespace __IO { namespace R { int x, ch; inline int read() { ch = getchar(); while (isspace(ch)) ch = getchar(); for (x = ch & 15, ch = getchar(); isdigit(ch); ch = getchar()) x = x * 10 + (ch & 15); return x; } }}using __IO::R::read;inline int max(int a, int b) {return a > b ? a : b;}#define maxn 300010int head[maxn], cnt;struct Edge { int to, nxt;} e[maxn << 1];inline void add(int a, int b) { e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;}int n, m;int w[maxn];int max1[maxn], max2[maxn], ans = -20040826;int dfs(int u, int fa = 0) { for (int i = head[u]; i; i = e[i].nxt) { int v = e[i].to; if (v != fa) { int tmp = dfs(v, u); if (tmp > max1[u]) { max2[u] = max1[u]; max1[u] = tmp; } else if (tmp > max2[u]) max2[u] = tmp; } } max1[u] += w[u]; ans = max(ans, max1[u] + max2[u]); return max1[u];}int main() { n = read(), m = read(); for (int i = 1, a, b; i < n; i++) { a = read(), b = read(); add(a, b); w[a]++, w[b]++; } for (int i = 1; i <= n; i++) w[i]--; dfs(1); printf("%d\n", ans + 2); return 0;}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/10009909.html

你可能感兴趣的文章
《C#线程参考手册》读书笔记(二):.NET中的线程
查看>>
Windows Security Login
查看>>
远程服务和本地服务
查看>>
SpringAOP小结
查看>>
单体内置对象的理解
查看>>
数据结构7_链二叉树
查看>>
使用Newtonsoft将DataTable转Json
查看>>
缓存类
查看>>
Spark RDD Transformation 简单用例(三)
查看>>
分治法理论
查看>>
澄甫先生谓古人练拳分四步功夫
查看>>
第八天
查看>>
C# Lambda表达式
查看>>
Android Studio中多项目共享Library
查看>>
用java的io流,将一个文本框的内容反转
查看>>
python: 不同级别的日志输出到不同文件的日志类
查看>>
[LeetCode] Trapping Rain Water
查看>>
linux下下载redis,并且编译
查看>>
FirstOrDefault()的重载方法
查看>>
SumElemet
查看>>