题目描述

对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大。

输入输出格式

输入格式:
在文本文件 worm.in 中第一行两个整数 N , M ,分别表示树中结点个数和树的边数。
接下来 M 行,每行两个整数 a, b 表示点 a 和点 b 有边连接( a, b ≤ N )。你可以假定没有一对相同的 (a, b) 会出现一次以上。
输出格式:
在文本文件 worm.out 中写入一个整数 , 表示最大的毛毛虫的大小。
输入输出样例
输入样例#1:
13 12
1 2
1 5
1 6
3 2
4 2
5 7
5 8
7 9
7 10
7 11
8 12
8 13
输出样例#1:
11

又是一道省选题。。。


题解

题目要我们找一条链,使链上的点数和与它相连的边数最大神TM毛毛虫
显然是一道树形DP题。先用一个数组t表示每个点所连的边数,f[i]表示从i的子树中一点到i的毛毛虫大小,为了方便,我把i当成,设v为它儿子,则f[i]=max{f[v]+t[u]-1},你可能会想,怎么统计答案?
我们设ma1为u所有儿子vk中最大的f[vk],ma2为次大的f[vk],ans=max{ma1+ma2+t[u]-1};


常数巨大的丑陋代码

# include <stdio.h>
# include <stdlib.h>
# include <iostream>
# include <string.h>
# include <math.h>
using namespace std;# define IL inline
# define RG register
# define UN unsigned
# define ll long long
# define rep(i, a, b) for(RG int i = a; i <= b; i++)
# define per(i, a, b) for(RG int i = b; i >= a; i--)
# define uev(e, u) for(RG int e = ft[u]; e != -1; e = edge[e].nt)
# define mem(a, b) memset(a, b, sizeof(a))
# define max(a, b) ((a) > (b)) ? (a) : (b)
# define min(a, b) ((a) < (b)) ? (a) : (b)IL int Get(){RG char c = '!'; RG int num = 0, z = 1;while(c != '-' && (c > '9' || c < '0')) c = getchar();if(c == '-') z = -1, c = getchar();while(c >= '0' && c <= '9') num = num * 10 + c - '0', c = getchar();return num * z;
}const int MAXN = 300001, INF = 2147483647;
struct Edge{int to, nt;
} edge[MAXN << 1];
int n, cnt, ft[MAXN], m, ans, t[MAXN], f[MAXN];IL void Add(RG int u, RG int v){edge[cnt] = (Edge){v, ft[u]}; ft[u] = cnt++; t[u]++;
}IL void Dfs(RG int u, RG int fa){RG int ma1 = 0, ma2 = 0;uev(e, u){RG int v = edge[e].to;if(v == fa) continue;Dfs(v, u);if(f[v] > ma1) ma2 = ma1, ma1 = f[v];else if(f[v] > ma2) ma2 = f[v];f[u] = max(f[u], f[v] + t[u] - 1);}ans = max(ans, ma1 + t[u] - 1 + ma2);
}int main(){mem(ft, -1);n = Get(); m = Get();rep(i, 1, n) f[i] = 1;rep(i, 1, m){RG int u = Get(), v = Get();Add(u, v); Add(v, u);}Dfs(1, 0);printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/cjoieryl/p/8206417.html

[HAOI2009]毛毛虫相关推荐

  1. P3174 [HAOI2009]毛毛虫(树形dp)

    P3174 [HAOI2009]毛毛虫 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树(图 1 )抽出一部分就变成了右边 ...

  2. P3174 [HAOI2009] 毛毛虫

    题意:给你一棵树,取出一根链和与链相邻的"脚":问能取出的最大节点数是多少? 分析:很容易想到:f[u] 是 u 为当前子树根节点的毛毛虫头时子树内毛毛虫最大点数.但当时其实最大的 ...

  3. [HAOI2009]毛毛虫 dfs

    很多题都是这个套路,第一遍树形dp,第二遍邻位容斥转移 注意讨论清楚转移方式 码: #include<iostream> #include<cstdio> #include&l ...

  4. NOIP前的刷题记录

    因为这几天要加油,懒得每篇都来写题解了,就这里记录一下加上一句话题解好了 P4071 [SDOI2016]排列计数   组合数+错排 loj 6217 扑克牌 暴力背包 P2511 [HAOI2008 ...

  5. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  6. 【haoi2009】毛毛虫

    题面 题目描述 对于一棵树,我们可以将某条链和与该链相连的边抽出来,看上去就象成一个毛毛虫,点数越多,毛毛虫就越大.例如下图左边的树,抽出一部分就变成了右边的一个毛毛虫了. 输入格式 第一行两个整数N ...

  7. BZOJ 2431: [HAOI2009]逆序对数列【DP】

    2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MB Description 对于一个数列aiai,如果有i<ji<j且 ...

  8. bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列

    http://www.lydsy.com/JudgeOnline/problem.php?id=2431 dp[i][j] 表示i的排列,有j个逆序对的方案数 加入i+1,此时i+1是排列中最大的数, ...

  9. IOS基础之毛毛虫案例-重力

    IOS基础之毛毛虫案例-重力 // // ViewController.m // 17-毛毛虫案例-重力 // // Created by 鲁军 on 2021/4/17. //#import &qu ...

最新文章

  1. 找到字符串中所有字母异位词—leetcode438
  2. Perl迎来25岁生日
  3. CSS 横向导航栏(由竖向改成横向 float)
  4. 加载的图片还会有未来吗?
  5. 草稿 爬虫-访问登陆可见的页面-请求时带上cookie数据
  6. 史上最壕无人车买家诞生!泥潭中的Uber要搞个超大的无人出租车队
  7. 1021个位数字统计
  8. git pull push 项目的时候总是提示要输入用户名密码的解决方案
  9. Hadoop工程包架构解析
  10. android app反解工具,安卓反编译逆向工具:Apktool + dex2jar 教程
  11. 升职加薪,必不可少!Python刷题打怪,你要的LeetCode答案都在这里了!
  12. 学习笔记|Pytorch使用教程22(hook函数与CAM可视化)
  13. 蘑菇丁周记范文计算机销售40篇,毕业生实习周记及销售实习周记范文 毕业生蘑菇钉周记范文(最新)...
  14. 用Python制作我的核酸检测日历
  15. Codeforces Round #507 B. Shashlik Cooking
  16. 陈强教授《机器学习及R应用》课程 第十三章作业
  17. ssh Key exchange was not finished sshd
  18. MFC -- ShowWindow(int nCmdShow)参数总结
  19. 自动驾驶定位技术之争:融合定位才是出路
  20. 周伯通的空明拳,米诺斯的星尘傀儡线,SAP Kyma的Serverless

热门文章

  1. 判断android应用程序是否已安装
  2. LINQ to SQL 在 Visual Studio 2008 中的简单应用
  3. LeetCode算法题-Nth Digit(Java实现)
  4. Spring Security OAuth 2开发者指南译
  5. swaggerui api.docs
  6. Python黑帽编程 3.1 ARP欺骗
  7. c语言:找出1到4000中,数字的各位数之和能被4整除的数有多少个?
  8. iOS网络开发(8)文件下载的实现
  9. Shell批量SSH免交互登录认证
  10. ETH网络要爆炸,未来Token的最佳选择注定是BCH