博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[haoi2009]毛毛虫 树形dp
阅读量:4595 次
发布时间:2019-06-09

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

这道题细节处理不少,但要AC不难;

设以i节点为根节点的子树能形成的最大的毛毛虫长度为f[i],则f[i]=max(f[j])+i节点的孩子数;

答案需要f最大和次大的两个子树合并,而且若合并的位置不是根节点,ans++;

我就是坑在了最后一点上,最后打表找到了问题;

1 #include
2 #include
3 #include
4 using namespace std; 5 const int maxn=303000; 6 int n,m,f[maxn],child[maxn]; 7 struct node{ 8 int y,next; 9 }e[maxn<<1];10 int linkk[maxn],len=0;11 void insert(int x,int y){12 e[++len].y=y;13 e[len].next=linkk[x];14 linkk[x]=len;15 }16 void init(){17 scanf("%d%d",&n,&m);18 int x,y;19 for(int i=1;i<=m;i++){20 scanf("%d%d",&x,&y);21 insert(x,y);insert(y,x);22 }23 }24 void dfs(int x,int fa){25 for(int i=linkk[x];i;i=e[i].next){26 if(e[i].y==fa)continue;27 child[x]++;28 dfs(e[i].y,x);29 }30 }31 int ans=0;32 void Dfs(int x,int fa){33 if(child[x]==0){34 f[x]=1;return;35 }36 int maxx[2]={
0,0};37 for(int i=linkk[x];i;i=e[i].next){38 if(e[i].y==fa)continue;39 Dfs(e[i].y,x);40 f[x]=max(f[x],f[e[i].y]+child[x]);41 if(f[e[i].y]>maxx[0])maxx[0]=f[e[i].y];42 if(f[e[i].y]>maxx[1])maxx[0]=maxx[1],maxx[1]=f[e[i].y];43 }44 ans=max(ans,f[x]+maxx[0]-1);45 if(x!=1)ans=max(ans,f[x]+maxx[0]);46 if(maxx[0]==0)ans=max(ans,f[x]);47 }48 void work(){49 dfs(1,0);50 Dfs(1,0);51 printf("%d\n",ans);52 }53 int main(){54 freopen("1.in","r",stdin);55 freopen("1.out","w",stdout);56 init();57 work();58 }
View Code

 

转载于:https://www.cnblogs.com/chadinblog/p/5843779.html

你可能感兴趣的文章
MySQL数据库免安装版配置
查看>>
你必知必会的SQL面试题
查看>>
html5 Canvas绘制时钟以及绘制运动的圆
查看>>
Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
查看>>
JavaScript空判断
查看>>
洛谷 P1439 【模板】最长公共子序列(DP,LIS?)
查看>>
python timeit
查看>>
Wireless Network 并查集
查看>>
51nod 1019 逆序数
查看>>
JCEF3——谷歌浏览器内核Java版实现(一):使用jawt获取窗体句柄
查看>>
Java性能总结四(转)
查看>>
net 程序员面试宝典
查看>>
2019年机器学习:追踪人工智能发展之路
查看>>
2.Android新版开发教程&笔记—Activity间的数据传递
查看>>
经典的电工电路图(转载的)
查看>>
Nginx详解三:Nginx基础篇之yum安装
查看>>
DataGuard 单实例到RAC搭建
查看>>
ASP.NET Zero--4.不使用谷歌字体,提升加载速度
查看>>
【心路历程】(NOIP 203)&(HNOI 355)
查看>>
css自问自答(一)
查看>>